onTouchEvent()和onTouch()的区别

64
在尝试了许多与 onTouchEvent 和 onTouch 相关的实验之后,我发现只要在声明接口并正确设置监听器的情况下,在任何地方(无论是在活动或视图中)都可以使用 onTouch 方法!另一方面,onTouchEvent 只能在视图内部使用! 我的假设是正确的吗?这是真正的区别吗?

@trojanfoe和stelios:感谢你们的问题和答案。但我有点困惑。原因是:“我有一个实现OnClickListener和相关onClick(View v)事件处理程序的活动。我没有实现OnTouchListener。但是我有onTouchEvent(MotionEvent e)来处理滑动事件。代码正常运行,没有问题。”所以我的疑问是onTouchEvent()在这里(在活动中)如何工作,因为它只在视图上工作?此外,我没有实现OnTouchLister或调用setOnTouchListener(),那么是什么使其工作? - Dexter
在onTouch()中返回true不会触发onTouchEvent。 - Johnny
7个回答

45

没错,onTouch()View用户用来获取触摸事件,而onTouchEvent()View派生类用来获取触摸事件。


3
不清楚这里的"derived classes"是什么意思,如果我在"activity"中工作,那我只会在这个"activity"中工作。 - ERJAN

37

我对onTouchEvent()和onTouch()的工作方式产生了一些疑惑(您可以看到我的评论),经过一些研究,以下是我所发现的内容。这对初学者可能有所帮助。

1)实现:

如果要使用onTouch(),你需要完成三件事情。

1- 实现OnTouchListener

2- 在你想设置捕获事件的视图上调用setOnTouchListener()

3- 重写onTouch()来处理事件

但是,如果你想使用onTouchEvent(),则无需执行上述步骤1和2。只需重写onTouchEvent()即可。

2)工作原理:

onTouch()可以在视图、视图组和活动中使用。这意味着你可以在视图、视图组或活动中使用onTouch()。此方法接受两个参数[onTouch(View v, MotionEvent e)]。这允许你为活动或视图组中的不同视图筛选事件。或者活动本身可以处理它。 onTouchEvent()只接受一个参数[onTouchEvent(MotionEvent e)]。因此,它只能在实现它或派生视图上使用。派生视图可以扩展在onTouchEvent()中定义的触摸行为。

我认为,这样的选项是安卓更灵活的开发哲学的一部分,但有时会为学习者带来困惑。


5

我使用过ontouch()和ontouchevent(),ontouch用于处理单个视图(如LinearLayout)中的元素,例如按钮、图像按钮等,而当我想要处理其他区域的元素(例如按钮)时,我会使用ontouchevent。


4
在创建自定义视图时,您可以使用以下方法:

@override onTouchEvent(MotionEvent e){}

而您可以将onTouch添加到任何View、ViewGroup或Activity中。

onTouch(View v, MotionEvent e) { //您可以过滤任何视图的触摸 }

onTouch是通用的,而onTouchEvent则是特定于View的。您还可以使用onTouch来过滤您的视图。

4

如果没有任何视图消费触摸事件,Activity实际上会调用onTouchEvent()。

正如您所说,只要满足以下条件,onTouch()就可以在任何类中使用:

  1. 该类(即Foo)实现了OnTouchListener接口
  2. 该类通过view.setOnTouchListener(foo);注册为侦听器

0

onTouchEvent 是由 ViewActivity 和其他基类如 LinearLayout 等实现的方法。

public boolean onTouchEvent(MotionEvent event) {
    throw new RuntimeException("Stub!");
}

你可以通过任何派生类覆盖这个方法

onTouch() 是由接口 OnTouchListener 定义的 { }

public interface OnTouchListener {         boolean onTouch(View var1,MotionEvent var2);     }

所以当将此接口设置为类时,您只需要实现其中一个。


0

我发现另一个区别。 onTouchEvent 似乎无法获取已弃用的事件 MotionEvent.ACTION_POINTER_2_DOWN 和 MotionEvent.ACTION_POINTER_2_UP。

当然,它们相当古老,我们不应该再使用它们了。

这是在 Android 5.1 api 22 中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接