侧边栏壁纸
博主头像
Stars-One的杂货小窝博主等级

所有的创作都是有价值的

  • 累计撰写 268 篇文章
  • 累计创建 46 个标签
  • 累计收到 27 条评论

目 录CONTENT

文章目录

Android 监听View滑动事件

Stars-one
2024-03-26 / 0 评论 / 0 点赞 / 35 阅读 / 2496 字

有这样的一个需求,APP首页布局已经是有了几个Fragment(fragment里又有recyclerview,可垂直滑动)

但是这个时候,我们的Activity又想要实现监听滑动效果,从而实现某个view的显示和隐藏,应该如何做?

刚开始研究了下,发现只能触发MotionEvent里的Action_Down事件,而无法得到后续的Action_up事件

最终还是采用了一个自定义ViewGroup来拦截事件传递(实际并没有拦截,只是追加了一个监听滑动逻辑),通过dispatchTouchEvent()方法来进行事件的分发

代码

class CustomViewGroup : FrameLayout {

    constructor(context: Context?) : super(context!!) {}
    constructor(context: Context?, attrs: AttributeSet?) : super(
        context!!, attrs
    ) {
    }

    override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
       //这里只是追加个逻辑,并没有拦截事件继续分发(否则会导致底层的recyclerview无法滚动了)
        gestureDetector.onTouchEvent(ev)
       
        return super.dispatchTouchEvent(ev)
    }

    private val gestureDetector by lazy{
        GestureDetector(context, gestureListener)
    }

    private val gestureListener = object : GestureDetector.SimpleOnGestureListener() {
        override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
            val diffY = e2.y - e1.y
			//diffY>0 表示手指向下滑动,列表向上移动
            scorllAction.invoke(diffY>0)
            return true
        }
    }
   
    private var scorllAction = {flag:Boolean->}

    //对外提供的设置滑动事件触发
    fun registerTouchEvent(action:(isUp:Boolean)->Unit) {
        scorllAction = action
    }
}

使用的话,将把上述的自定义View作为Activity的根布局即可

最终,调用上篇博客讲到的动画效果,就能够实现常见的上滑出现一个view和下移则隐藏一个view的效果了

0

评论区