ViewPager2嵌套RecyclerView,降低ViewPager2灵敏度

581 阅读1分钟

Activity里由VeiwPager2+Fragment+RecyclerView组合,在下拉Recyclerview时ViewPager2特别灵敏,非常容易左右滑动。

解决思路是通过手势监听在下拉时禁止viewpager2滑动

在Activity里实现dispatchTouchEvent方法


private var startX = 0
private var startY = 0
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {

        when(ev?.action){
            MotionEvent.ACTION_DOWN ->{
                startX = ev.x.toInt()
                startY = ev.y.toInt()
            }
            MotionEvent.ACTION_MOVE ->{
                val endX = ev.x.toInt()
                val endY = ev.y.toInt()
                val tempX = abs(endX - startX)
                val tempY = abs(endY - startY)
                if(tempX < tempY){
                    ac.binding.actWatchfaceViewPage.isUserInputEnabled = false

                }
            }
            MotionEvent.ACTION_UP ->{
                startX = 0
                startY = 0
                ac.binding.actWatchfaceViewPage.isUserInputEnabled = true
            }
            MotionEvent.ACTION_CANCEL->{

            }

        }
    return super.dispatchTouchEvent(ev)
}

image.png

PS ViewPage1 是这样写的

public class CustomViewPager extends ViewPager {

    private static final int TOUCH_SLOP = 30; // 你可以调整这个值来改变灵敏度

    private float mDownX;
    private float mLastX;

    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mDownX = ev.getX();
                mLastX = mDownX;
                break;
            case MotionEvent.ACTION_MOVE:
                final float deltaX = Math.abs(ev.getX() - mLastX);
                if (deltaX > TOUCH_SLOP) {
                    // 当滑动距离超过TOUCH_SLOP时,才拦截事件
                    return true;
                }
                break;
        }
        mLastX = ev.getX();
        return super.onInterceptTouchEvent(ev);
    }
}