Медленно прокрутите ScrollView вверх

Вопрос: «Как мне прокрутить ScrollView вверх очень плавно и медленно».

В моем особом случае мне нужно прокрутить вверх примерно за 1-2 секунды. Я пытался интерполировать вручную с помощью обработчика (вызывая scrollTo (0, y)), но это вообще не сработало.

Я уже видел этот эффект в некоторых приложениях для чтения книг, так что должен быть способ, я уверен: D. (Текст очень медленно прокручивается вверх, чтобы продолжить чтение, не касаясь экрана, выполняя ввод).


person poitroae    schedule 26.08.2011    source источник


Ответы (5)


Через 2 секунды переместите прокрутку на позицию 2000.

new CountDownTimer(2000, 20) {          

 public void onTick(long millisUntilFinished) {     
   scrollView.scrollTo(0, (int) (2000 - millisUntilFinished)); // from zero to 2000    
 }          

 public void onFinish() {  
 }      

}.start(); 
person Lumis    schedule 26.08.2011
comment
Эй, я не знал о CountDownTimer, так что одно это заслуживает благодарности :). Наконец, это было решено с помощью CountDownTimer, но с измененным кодом. Прокрутка выполняется с помощью scrollBy вместо scrollTo, чтобы можно было легко указать скорость прокрутки. Кроме того, я добавил функциональность, чтобы просто прокрутить вверх, и на этом мы закончили. (Не начиная где-либо еще, например, внизу и т. Д., И прокручивайте еще вверх, если мы уже наверху). - person poitroae; 27.08.2011
comment
Да, это хороший способ использовать scrollBy, легче настроить движение. Возможно, вам следует опубликовать свое решение, так как люди часто задают этот вопрос;) - person Lumis; 27.08.2011
comment
привет, Люмис, я столкнулся с той же проблемой .. не могли бы вы взглянуть на мой опубликовать пожалуйста..спасибо - person vinothp; 30.07.2012
comment
@Michael Майкл, я столкнулся с той же проблемой .. не могли бы вы взглянуть на мой опубликовать пожалуйста..спасибо - person vinothp; 30.07.2012
comment
как прокрутить от определенного представления до нижней части представления - person Logic; 22.01.2016

Я сделал это с помощью объектного аниматора (доступно в API >= 3), и это выглядит очень хорошо:

Определите ObjectAnimator: final ObjectAnimator animScrollToTop = ObjectAnimator.ofInt(this, "scrollY", 0);

(this относится к классу, расширяющему ScrollView Android)

вы можете установить его продолжительность по своему желанию:

animScrollToTop.setDuration(2000); (2 секунды)

P.S. Не забудьте запустить анимацию.

person Daniel L.    schedule 20.01.2013
comment
0 - это параметр, до которого вы хотите прокрутить - person Arlind; 04.09.2015
comment
@Arlind Извините, если немного поздно, вы можете указать ширину или высоту компонента, который вы хотите прокручивать, вместо ZERO. - person Basil Battikhi; 13.01.2019

Попробуйте следующий код:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
    ValueAnimator realSmoothScrollAnimation = 
        ValueAnimator.ofInt(parentScrollView.getScrollY(), targetScrollY);
    realSmoothScrollAnimation.setDuration(500);
    realSmoothScrollAnimation.addUpdateListener(new AnimatorUpdateListener()
    {
        @Override
        public void onAnimationUpdate(ValueAnimator animation)
        {
            int scrollTo = (Integer) animation.getAnimatedValue();
            parentScrollView.scrollTo(0, scrollTo);
        }
    });

    realSmoothScrollAnimation.start();
}
else
{
    parentScrollView.smoothScrollTo(0, targetScrollY);
}
person Muzikant    schedule 19.11.2014
comment
это гладко, у меня разные проблемы с тем, что я сейчас пытаюсь сделать, но это определенно обеспечивает плавную прокрутку - person CQM; 31.05.2015

Вы пробовали smoothScrollTo(int x, int y)? Вы не можете установить параметр скорости, но, возможно, эта функция вам подойдет.

person VinceFR    schedule 26.08.2011

Вы можете использовать классы Timer и TimerTask. Вы можете сделать что-то вроде

scrollTimer = new Timer();
scrollerSchedule = new TimerTask(){
    @Override
    public void run(){
        runOnUiThread(SCROLL TO CODE GOES HERE);
    }
};
scrollTimer.schedule(scrollerSchedule, 30, 30);
person blessenm    schedule 26.08.2011