ScrollView, скользящий снизу вверх, программно - PullRequest
0 голосов
/ 22 января 2012

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

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

при запуске:

@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);
    }
};

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

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

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

1 Ответ

0 голосов
/ 22 января 2012

Ну, на данный момент я решил использовать этот другой подход, но если у кого-то есть лучшее предложение, давай. Я удалил макет 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();
                }

    }
};

Работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...