Android 监听View滑动事件
本文为作者原创,允许转载,不过请在文章开头明显处注明链接和出处!!! 谢谢配合~
作者:stars-one
链接:https://www.cnblogs.com/stars-one/p/18004864
本篇大约有1285个字,阅读预计需要1.61分钟
有这样的一个需求,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的效果了
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)