Scroll up a ScrollView slowly

2019-01-19 12:41发布

问题:

The question is "How do i scroll up a ScrollView to top very smoothly and slowly".

In my special case i need to scroll to top in about 1-2 seconds. Ive tried interpolating manually using a Handler (calling scrollTo(0, y)) but that didnt work at all.

I've seen this effect on some bookreader-apps yet, so there must be a way, im sure :D. (Text is very slowly scrolling up to go on reading without touching the screen, doing input).

回答1:

In 2 seconds move the scroll view to the possition of 2000

new CountDownTimer(2000, 20) {          

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

 public void onFinish() {  
 }      

}.start(); 


回答2:

I did it using object animator (Available in API >= 3) and it looks very good:

Define an ObjectAnimator: final ObjectAnimator animScrollToTop = ObjectAnimator.ofInt(this, "scrollY", 0);

(this refers to the class extending Android's ScrollView)

you can set its duration as you wish:

animScrollToTop.setDuration(2000); (2 seconds)

P.s. Don't forget to start the animation.



回答3:

Try the following code:

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


回答4:

Have you tried smoothScrollTo(int x, int y)? You can't set the speed parameter but maybe this function will be ok for you



回答5:

You could use the Timer and TimerTask class. You could do something like

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