Android scrollview监听滑动状态

android 专栏收录该内容
66 篇文章 1 订阅

首先说一下 NestedScrollView 的滑动事件的监听,

如果使用 

nestedScrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
            @Override
            public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {

            }
        });

这个方法在 API >= 23  时才可以使用,怎么解决呢 。我们可以自己定义一个ScrollView

public class MyScrollView extends NestedScrollView {
    
    private OnScrollChanged mOnScrollChanged;
    
    public MyScrollView(Context context) {
        this(context, null);
    }

    public MyScrollView(Context context, AttributeSet attributeSet) {
        this(context, attributeSet, 0);
    }


    public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (mOnScrollChanged != null) {
            mOnScrollChanged.onScroll(l, t, oldl, oldt);
        }
    }

    public void setOnScrollChanged(OnScrollChanged onScrollChanged) {
        this.mOnScrollChanged = onScrollChanged;
    }

    public interface OnScrollChanged {
        void onScroll(int l, int t, int oldl, int oldt);
    }
}

这样我们就可以通过实现 onScrollChanged() 监听滑动事件了 ,其中可以监测到滑动距离,这样就可以做好多事情了;

但是现在有一个需求就是【滑动的时候隐藏 一个靠边的悬浮框,不滑动是悬浮框显示出来】,这样的话就需要监测滑动状态了。scrollview 不像recyclerview一样可以监测滑动状态。

以下是我的一个实现方案,通过CountDownTimer 来实现

在刚才的onScrollChanged  接口中增加方法

public interface OnScrollChanged {
        void onScroll(int l, int t, int oldl, int oldt);

        void onTouch(boolean isDown);
    }

然后重写onTouchEvent方法

@Override
    public boolean onTouchEvent(MotionEvent ev) {
            switch (ev.getAction()) {
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                if (mOnScrollChanged != null) {
                    mOnScrollChanged.onTouch(false);
                }
                break;
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                if (mOnScrollChanged != null) {
                    mOnScrollChanged.onTouch(true);
                }
                break;
        }
        return super.onTouchEvent(ev);
    }

这里的isDown=true代表是按下或者滑动的状态,对应ACTION_DOWN和ACTION_MOVE,fale代表ACTION_UP和ACTION_CANCEL

下面使用这个自定义的scrollerview

//静止状态
private final static int SCROLL_STATE_IDLE = 1;
//拖动或者惯性滑动状态
private final static int SCROLL_STATE_SCROLL = 2;

//判断是否是拖动状态
boolean isDragState = false;

int currentState = SCROLL_STATE_IDLE;

//这里采用100ms来判断是否已经是静止状态,100ms结束后证明是静止状态
private CountDownTimer scrollCountTimer = new CountDownTimer(100, 1) {
        @Override
        public void onTick(long millisUntilFinished) {

        }

        @Override
        public void onFinish() {
            setScrollState(SCROLL_STATE_IDLE);
        }
};

private void initScrollView() {
        scrollView.setOnScrollChanged(new MyScrollView.OnScrollChanged() {
            @Override
            public void onScroll(int l, int t, int oldl, int oldt) {
                if (isDragState) {//拖动状态单独处理不再进行滚动状态监测
                    return;
                }
                //滑动时先取消倒计时,设置滑动状态
                scrollCountTimer.cancel();
                if(currentState != SCROLL_STATE_SCROLL) {
                    setScrollState(SCROLL_STATE_SCROLL);
                }
                scrollCountTimer.start();
            }

            @Override
            public void onTouch(boolean isDown) {
                isDragState = isDown;
                //我这里把按下的状态默认为了滚动的状态,当然你也可以分开定义
                if (isDown) {
                    scrollCountTimer.cancel();
                    setScrollState(SCROLL_STATE_SCROLL);
                } else {
                    scrollCountTimer.start();
                }
            }
});
//最后记得页面销毁时,cancel掉timer

 

  • 0
    点赞
  • 2
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值