美文网首页
ViewPager2 TabLayout Fragment Re

ViewPager2 TabLayout Fragment Re

作者: 克罗克达尔 | 来源:发表于2021-08-03 11:49 被阅读0次

    在使用 ViewPager2 TabLayout Fragment RecyclerView 的时候发现这样一个问题:
    竖直滑动RecyclerView的时候如果不小心发生了水平滑动,RecyclerView就滑动不了了,只能滑动ViewPager2,这种体验不是很好。


    Record_2021-08-03-11-42-55_d11621d41b37c1cee374f534be417c31.2021-08-03 11_47_33.gif

    以下是我的解决方案,亲测有效

    
    
    class RecyclerViewAtViewPager2 : RecyclerView {
        constructor(context: Context) : super(context)
        constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
        constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
            context,
            attrs,
            defStyleAttr
        )
    
        private var startX = 0f
        private var startY = 0f
    
        override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
            when (ev.action) {
                MotionEvent.ACTION_DOWN -> {
                    startX = ev.x
                    startY = ev.y
                }
                MotionEvent.ACTION_MOVE -> {
    
                    val endX = ev.x
                    val endY = ev.y
                    val disX = Math.abs(endX - startX)
                    val disY = Math.abs(endY - startY)
    
                    "start x = $startX , start y = $startY , end x = $endX , end y = $endY , dis x = $disX , dis y = $disY".log()
                    startX = endX
                    startY = endY
    
                    if (disY > disX) {
                        //发生了竖向滑动
                        getViewPager2(parent)?.isUserInputEnabled = false
                    }
    
                }
                MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
                    getViewPager2(parent)?.isUserInputEnabled = true
    
                }
            }
            return super.dispatchTouchEvent(ev)
        }
    
    
        private fun getViewPager2(viewParent: ViewParent): ViewPager2? {
    
            return when {
                viewParent is ViewPager2 -> {
                    viewParent
                }
                viewParent.parent != null -> {
                    getViewPager2(viewParent.parent)
                }
                else -> {
                    null
                }
            }
        }
    }
    
    

    使用RecyclerViewAtViewPager2替代RecyclerView

    相关文章

      网友评论

          本文标题:ViewPager2 TabLayout Fragment Re

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