android - 从下到上滚动 ListView

标签 android listview animation android-scrollview

有一个 ListView,当 Activity 开始时,我希望它从底部滚动到顶部。我可以通过在 onCreate 中设置 myListView.setStackFromBottom(true) 来实现此功能,以便在 Activity 加载时列表位于底部。

然后我重写onWindowFocusChanged并使用smoothScrollToPosition(0)将列表滚动到顶部。但是,我需要滚动速度在到达顶部时逐渐减慢,类似于快速滑动的情况。有没有办法通过动画或其他方式来做到这一点?

谢谢。

最佳答案

您可以使用CountDownTimer编写自己的滚动条。

import android.content.Context;
import android.os.CountDownTimer;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.animation.AnticipateOvershootInterpolator;
import android.view.animation.Interpolator;
import android.widget.ScrollView;

public class SmoothScrollView extends ScrollView {

    private static final long SCROLL_DURATION = 1500; //milliseconds
    //interpolator for scroller
    private static final Interpolator INTERPOLATOR = new AnticipateOvershootInterpolator(1);

    private SmoothScroller smoothScroller;


    public SmoothScrollView(Context context) {
        this(context, null, 0);
    }


    public SmoothScrollView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }


    public SmoothScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setSmoothScrollingEnabled(true);
    }


    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (smoothScroller != null)//we are scrolling
            return true;
        else return super.onTouchEvent(ev);
    }

    @Override
    public boolean executeKeyEvent(KeyEvent ev) {
        if (smoothScroller != null)//we are scrolling
            return true;
        else return super.executeKeyEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (smoothScroller != null)//we are scrolling
            return true;
        else return super.onInterceptTouchEvent(ev);
    }

    public void smoothScrollTo(int scrollX, int scrollY) {
        if (smoothScroller != null) {
            smoothScroller.cancel();
        }
        int deltaY = scrollY - getScrollY();
    int deltaX = scrollX - getScrollX();
        smoothScroller = new SmoothScroller(SCROLL_DURATION, getScrollX(), getScrollY(), deltaX, deltaY);
        smoothScroller.start();
    }

    private class SmoothScroller extends CountDownTimer {

        private int fromX;
        private int fromY;
        private int deltaX;
        private int deltaY;
        private float scrollTime;

        public SmoothScroller(long scrollTime, int fromX, int fromY, int deltaX, int deltaY) {
            super(scrollTime, 1);
            this.scrollTime = scrollTime;
            this.fromX = fromX;
            this.fromY = fromY;
            this.deltaX = deltaX;
            this.deltaY = deltaY;
        }

        @Override
        public void onTick(long millisUntilFinished) {
                float delta = (scrollTime - millisUntilFinished) / scrollTime;
                delta = INTERPOLATOR.getInterpolation(delta);
                int x = fromX + ((int) (delta * deltaX));
                int y = fromY + ((int) (delta * deltaY));
                smoothScrollTo(x, y);
        }

        @Override
        public void onFinish() {
                float delta = 1f;
                int x = fromX + ((int) (delta * deltaX));
                int y = fromY + ((int) (delta * deltaY));
                smoothScroller = null;
                scrollTo(x, y);
        }
    }
}

我用的就是这个。只需根据您的需要更改 INTERPOLATORSCROLL_DURATION 并调用 smoothScrollTo 而不是 scrollTo

我非常确定将 ScrollView 更改为 ListView 不会导致任何问题。

关于android - 从下到上滚动 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23746144/

相关文章:

java - 如何使用 Exchangeratesapi.io 和 okhttp 更改汇率基础货币,并在微调器中选择所有基础货币?

javascript - 解析云函数返回 null

android - 如何动态创建listView?

android - 如何更改抽屉导航中列表选定项目的颜色?

幻灯片 Activity 转换中的 Android 错误

iOS - MapKit 相机旋转动画

java - Mediaplayer 未打开选定的文件 android(setDataSource 失败。: status=0x80000000)

java - android 中 ScrollView 中的图像

android - 使用 SD 卡中的图像填充 ListView (不是列表中一定数量的项目)

java - 是否可以在javafx中的对话框上使用路径转换?