安卓开发Android开发经验谈安卓开发

SwipeRefreshLayout内嵌ViewPager滑动冲

2019-08-16  本文已影响7人  蓝不蓝编程

问题描述

当在SwipeRefreshLayout内嵌ViewPager时,出现ViewPager横向滑动不畅,很难滑.

解决方案

自定义SwipeRefreshLayout,重写onInterceptTouchEvent函数.
根据下滑的角度来判断是否让SwipeRefreshLayout处理事件,还是让子控件来处理.

class VpSwipeRefreshLayout(context: Context, attrs: AttributeSet) : SwipeRefreshLayout(context, attrs) {

    private var startY: Float = 0.toFloat()
    private var startX: Float = 0.toFloat()
    /**
     *  记录viewPager是否正处于拖拽的标记
     */
    private var mIsVpInDrag: Boolean = false
    private val mTouchSlop: Int = ViewConfiguration.get(context).scaledTouchSlop

    override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
        when (ev.action) {
            MotionEvent.ACTION_DOWN -> {
                // 记录手指按下的位置
                startY = ev.y
                startX = ev.x
                // 初始化标记
                mIsVpInDrag = false
            }
            MotionEvent.ACTION_MOVE -> {
                // 如果viewpager正在拖拽中,那么不拦截它的事件,直接return false;
                if (mIsVpInDrag) {
                    return false
                }

                // 获取当前手指位置
                val endY = ev.y
                val endX = ev.x
                val distanceX = abs(endX - startX)
                val distanceY = abs(endY - startY)
                // 如果X轴位移大于Y轴位移,那么将事件交给viewPager处理。
                if (distanceX > mTouchSlop && distanceX > distanceY) {
                    mIsVpInDrag = true
                    return false
                }
            }
            MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL ->
                // 初始化标记
                mIsVpInDrag = false
        }
        // 如果是Y轴位移大于X轴,事件交给swipeRefreshLayout处理。
        return super.onInterceptTouchEvent(ev)
    }
}

参考资料

Android:SwipeRefreshLayout和ViewPager滑动冲突的原因和正确的解决方式

上一篇下一篇

猜你喜欢

热点阅读