Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中向视图添加手势检测器_Android_Touch Event_Gesturedetector - Fatal编程技术网

如何在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) }