如何在Android中向视图添加手势检测器
在我的项目中,我正在努力为子视图添加一个手势检测器。我是否覆盖父对象的如何在Android中向视图添加手势检测器,android,touch-event,gesturedetector,Android,Touch Event,Gesturedetector,在我的项目中,我正在努力为子视图添加一个手势检测器。我是否覆盖父对象的onTouchEvent或子对象的onTouchEvent?我是否制作一个OnTouchListener并在那里添加手势检测器?显示了如何将手势检测器添加到活动本身的示例,但不清楚如何将其添加到视图。如果子类化视图(示例),也可以使用相同的过程,但是我想添加手势,而不需要子类化任何内容 这是我能找到的最接近的另一个问题,但它只针对图像视图,而不是任何视图的一般情况。对于何时返回true或false,这些答案也存在一些分歧 为了
onTouchEvent
或子对象的onTouchEvent
?我是否制作一个OnTouchListener
并在那里添加手势检测器?显示了如何将手势检测器添加到活动本身的示例,但不清楚如何将其添加到视图。如果子类化视图(示例),也可以使用相同的过程,但是我想添加手势,而不需要子类化任何内容
这是我能找到的最接近的另一个问题,但它只针对图像视图
,而不是任何视图
的一般情况。对于何时返回true
或false
,这些答案也存在一些分歧
为了帮助自己理解它是如何工作的,我做了一个独立的项目。我的答案如下。此示例演示如何将手势检测器添加到视图中。布局只是活动内部的一个
视图。可以使用相同的方法将手势检测器添加到任何类型的视图中
我们将把手势检测器添加到绿色的视图中
MainActivity.java
基本思想是向视图中添加一个。通常我们会在这里获取所有原始的触摸数据(如动作向下
,动作向上移动
,动作向上
,等等),但我们不会自己处理,而是将其转发到手势检测器来解释触摸数据
我们正在使用一种新的方法。这个手势检测器的优点是我们只需要覆盖我们需要的手势。在这里的例子中,我包括了很多。你可以去掉那些你不需要的。(但是,您应该始终在onDown()
中返回true
。返回true意味着我们正在处理事件。返回false将使系统停止向我们提供更多的触摸事件。)
这是一个运行此项目的快速设置,因此我建议您尝试一下。请注意日志事件发生的方式和时间。kotlin中的简短版本仅用于检测视图的双击:
val gestureDetector = GestureDetector(activity, object : GestureDetector.SimpleOnGestureListener() {
override fun onDoubleTap(e: MotionEvent?): Boolean {
Log.d("myApp", "double tap")
return true
}
})
myView.setOnTouchListener { _, event -> gestureDetector.onTouchEvent(event) }
别忘了让myView
clickable可以在onCreate()上检测手势吗?我无法在MyGestureListener类中执行操作我的问题是关于你的答案的,因此在新帖子中很难解释,我只是想问是否可以在oncreate()方法中重写onScroll()/onLongPress()/onSingleTapConfiged(),并在那里实现这些方法?@Coder123,您正在谈论的重写方法是SimpleOnGestureListener的一部分,因此如果您不将该类(或GestureDetector)划分为子类,我认为没有办法做到这一点。您唯一的其他选择是在OnTouchListener中手动处理事件。这对约束布局、线性布局甚至空视图都不起作用。谢谢。一个小的修正:需要重写onDown()并返回true,否则它将无法工作
val gestureDetector = GestureDetector(activity, object : GestureDetector.SimpleOnGestureListener() {
override fun onDoubleTap(e: MotionEvent?): Boolean {
Log.d("myApp", "double tap")
return true
}
})
myView.setOnTouchListener { _, event -> gestureDetector.onTouchEvent(event) }