2012-01-22 3 views
0

Я бы хотел иметь эффект, похожий на «конечные титры» в фильмах, где имена участников для проектов плавно скользят снизу вверх. Я думал о ScrollView и это моя идея (ясно, что она не работает): В OnCreate:ScrollView сползает снизу вверх, программно

sv = (ScrollView)findViewById(R.id.scroll_text); 

в OnStart:

@Override 
public void onStart() 
{ 
    super.onStart(); 
    sv.post(new Runnable() { 

     @Override 
     public void run() { 
      sv.fullScroll(ScrollView.FOCUS_DOWN); 
     } 
    }); 

} 

В onWindowsFocusChanged:

@Override 
public void onWindowFocusChanged(boolean hasFocus) 
{ 
    if (hasFocus) 
    { 

     int display_h = display.getHeight(); 
     pos_y = display_h; 
     mScrollHandler.removeCallbacks(mUpdateScroll); 
     mScrollHandler.postDelayed(mUpdateScroll, 0);  

    } 
    else 
    { 

     mScrollHandler.removeCallbacks(mUpdateScroll); 

    } 
} 

И это для обработчика:

private Runnable mUpdateScroll = new Runnable() { 
    public void run() { 
     pos_y = pos_y - 1; 
     sv.scrollTo(0, pos_y); 
     mScrollHandler.postDelayed(mUpdateScroll, 100); 
    } 
}; 

Здесь журнал переменной pos_y корректно отображает изменения с 480 на 0, плавно. Моя идея заключалась в том, что взгляды прокручиваются снизу вверх, на 10 пикселей в секунду.

К сожалению, макет внутри прокрутки полностью отображается при запуске деятельности. В scrollview я использовал классическую вертикальную линейку Layout со всеми строками внутри нее, загружая в onCreate.

Кто-нибудь мне поможет?

ответ

0

Ну, на данный момент я решил использовать этот другой подход, но если у кого-то есть лучшее предложение, давай. Я удалил макет ScrollView, и я использовал классический RelativeLayout со всем текстом, который мне нужен для цикла.

В OnCreate:

display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 
    int display_h = display.getHeight(); 
    pos_y = display_h; 

В onWindowsFocusChanged:

@Override 
public void onWindowFocusChanged(boolean hasFocus) 
{ 
    if (hasFocus) 
    { 

    RelativeLayout r_main = (RelativeLayout)findViewById(R.id.RelativeTables);   
     RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)r_main.getLayoutParams();   
     params.leftMargin = 0; 
     params.topMargin = pos_y; 
     r_main.setLayoutParams(params); 
mScrollHandler.removeCallbacks(mUpdateScroll); 
      mScrollHandler.postDelayed(mUpdateScroll, 0);  

} 
else 
{ 

    mScrollHandler.removeCallbacks(mUpdateScroll); 

} 

}

И, наконец, в работоспособной:

private Runnable mUpdateScroll = new Runnable() { 
public void run() { 
    pos_y = pos_y - 1; 
    RelativeLayout r_main = (RelativeLayout)findViewById(R.id.RelativeTables);   
      RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)r_main.getLayoutParams();   
      params.leftMargin = 0; 
      params.topMargin = pos_y; 
      r_main.setLayoutParams(params); 
    mScrollHandler.postDelayed(mUpdateScroll, 100); 

// the running cycle: 
if (pos_y<-display.getHeight()) { 
        pos_y = display.getHeight(); 
       } 

    } 
}; 

Он работает.