Android监听ScrollView控件的滑动起始和结束事件

目录

  • 目录
  • 前言
  • 实现方案
    • 实现思路
    • 关键代码

前言

最近还是有点忙的,所以博客写的少了,更主要的原因可能是最近在追《Android开发艺术探索》,估计看完还需要再几周的时间,所以……

记录工作中遇到的一个问题以及我的解决方案。最近需要在一个圆形的屏幕上为滚动控件增加一个弧形滑动侧边栏,其实就是ScrollBar。

ScrollBar的实现比较简单,自定义一个控件,确定好圆心,画圆弧即可。但是,在整合ScrollBar的时候,遇到了一些问题。这两天解决的就是如何监控ScrollView的滑动开始和结束,能够监测到ScrollView的滑动开始和结束事件之后,才能正确的控制ScrollBar的Visible和Gone。

实现方案

实现思路

  1. 需要自定义控件继承自ScrollView,重载ScrollView的onScrollChanged方法,这个方法在ScrollView每次滑动时都会被调用。因此,我们可以保存一个全局变量lastScrollUpdate,每次onScrollChanged方法被调用时,修改lastScrollUpdate值为System.currentTimeMillis(),用于记录当前滑动的起始时间。
  2. 同时,我们在onScrollChanged中开启一个延迟任务,作用就是在100ms(该时间可自由定制,时间越短,监听越精确,但是负载越高)之后,监控ScrollView是否还在滑动。具体方式是:在任务开始时获取当前系统时间currentTime = System.currentTimeMillis(),如果currentTime - lastScrollUpdate > 100时,说明ScrollView滑动已经停止。反之,则ScrollView仍在滑动。因为,如果ScrollView仍在滑动,会修改了lastScrollUpdate值,导致该值增加。

关键代码

public class CustomScrollView extends ScrollView {
    /** * Runnable延迟执行的时间 */
    private long delayMillis = 100;

    /** * 上次滑动的时间 */
    private long lastScrollUpdate = -1;


    private Runnable scrollerTask = new Runnable() {
        @Override
        public void run() {
            long currentTime = System.currentTimeMillis();
            if ((currentTime - lastScrollUpdate) > 100) {
                lastScrollUpdate = -1;
                onScrollEnd();
            } else {
                postDelayed(this, delayMillis);
            }
        }
    };

    public CustomScrollView(Context context) {
        this(context, null);
    }

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

    public CustomScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);

        if (lastScrollUpdate == -1) {
            onScrollStart();
            postDelayed(scrollerTask, delayMillis);
        }
        // 更新ScrollView的滑动时间
        lastScrollUpdate = System.currentTimeMillis();
    }

    /** * 滑动开始 */
    private void onScrollStart() {
    }

    /** * 滑动结束 */
    private void onScrollEnd() {
    }
}

你可能感兴趣的:(android,scrollbar)