美文网首页安卓开发Android开发经验谈安卓开发
SwipeRefreshLayout内嵌ViewPager滑动冲

SwipeRefreshLayout内嵌ViewPager滑动冲

作者: 蓝不蓝编程 | 来源:发表于2019-08-16 16: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滑动冲突的原因和正确的解决方式

    相关文章

      网友评论

        本文标题:SwipeRefreshLayout内嵌ViewPager滑动冲

        本文链接:https://www.haomeiwen.com/subject/atdqsctx.html