有这样的一个需求,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的效果了
评论区