Android 监听View滑动事件

本文为作者原创,允许转载,不过请在文章开头明显处注明链接和出处!!! 谢谢配合~
作者:stars-one
链接:https://www.cnblogs.com/stars-one/p/18004864

本篇大约有1285个字,阅读预计需要1.61分钟


原文: Android 监听View滑动事件-Stars-One的杂货小窝

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

posted @   Stars-one  阅读(153)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示