您当前的位置: 首页 > 

蓝不蓝编程

暂无认证

  • 0浏览

    0关注

    706博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

SwipeRefreshLayout内嵌ViewPager滑动冲突解决方案(在父控件解决冲突)

蓝不蓝编程 发布时间:2019-08-16 16:16:39 ,浏览量:0

问题描述

当在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滑动冲突的原因和正确的解决方式

关注
打赏
1639405877
查看更多评论
立即登录/注册

微信扫码登录

0.0432s