重写SwipeRefreshLayout下拉刷新,避免在左右滑动时执行下拉刷新操作

本文介绍了一种改进的SwipeRefreshLayout实现——VerticalSwipeRefreshLayout。该组件通过增加X轴滑动的容差来避免水平滑动误触发下拉刷新的问题。通过重写触摸事件处理逻辑,确保只有在垂直滑动时才响应下拉刷新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用SwipeRefreshLayout时我们注意到在SwipeRefreshLayout中左右滑动时可能也会触发下拉刷新的事件,这点让我们很不爽。追其原因是SwipeRefreshLayout对于y轴触摸举例十分明感,没有做太多的容差处理(似乎容差值仅有16),所以如果你不是完全水平的滑动的话就很可能会触发下拉刷新的事件。为了解决这个问题,我们重写了SwipeRefreshLayout的触摸事件,当触摸的X距离大于某个数值的时候,我们就让它认为我们是在左右滑动,不执行下拉刷新操作。
VerticalSwipeRefreshLayout

    import android.content.Context;
    import android.support.v4.widget.SwipeRefreshLayout;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.ViewConfiguration;


    /**
     * @author lishan
     * @brief 只在竖直方向才能下拉刷新的控件
     * @date 2016/8/7
     */
    public class VerticalSwipeRefreshLayout extends SwipeRefreshLayout {
        private int mTouchSlop;
        // 上一次触摸时的X坐标
        private float mPrevX;
        public VerticalSwipeRefreshLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
            // 触发移动事件的最短距离,如果小于这个距离就不触发移动控件
            mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
        }

        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mPrevX = event.getX();
                    break;
                case MotionEvent.ACTION_MOVE:
                    final float eventX = event.getX();
                    float xDiff = Math.abs(eventX - mPrevX);
                    // Log.d("refresh" ,"move----" + eventX + "   " + mPrevX + "   " + mTouchSlop);
                    // 增加60的容差,让下拉刷新在竖直滑动时就可以触发
                    if (xDiff > mTouchSlop + 60) {
                        return false;
                    }
            }
            return super.onInterceptTouchEvent(event);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值