2011-02-15 53 views
54

经过对onTouchEvent和onTouch的许多实验后,我发现onTouch可以在任何地方工作(无论是在活动还是视图中),只要您声明了接口并将Listener正确!另一方面,onTouchEvent只能在View中使用! 我的假设是否正确?这是真正的区别吗?onTouchevent()vs onTouch()

+0

@trojanfoe&stelios:谢谢你们提出的问题和答案。但我有点困惑。原因是 - “我有一个活动实现了OnClickListener和相关的onClick(View v)事件处理程序,我没有实现onTouchListener,但是我有onTouchEvent(MotionEvent e)来处理滑动事件,代码工作正常,没有问题。 “所以我的疑问是,onTouchEvent()如何在这里工作(在活动上),因为它仅适用于视图?此外,我还没有实现OnTouchLister或调用setOnTouchListener(),那么它的工作原理是什么? – Dexter 2014-04-13 12:05:13

+0

在onTouch()返回`true`将不会触发onTouchEvent。 – Johnny 2017-05-23 17:41:38

回答

37

是的,你是正确的 - onTouch()所使用的用户ViewonTouchEvent()所使用的派生类的View获得触摸事件获得的触摸事件。

4

如果没有任何视图消耗触摸事件,onTouchEvent()实际上将被调用。

正如你所说,onTouch()可以在任何类中使用,只要:

  1. 这个类(即富)实现OnTouchListener接口和
  2. 这个类是注册监听器使用view.setOnTouchListener(foo);
5

我已经使用ontouch()和的onTouchEvent(),如ontouch使用时,我想在单个视图中的元件工作,如按钮,imagebuttons等单视图(比方说的LinearLayout),而当我想要在其他地方工作y元素(例如按钮)我使用ontouchevent。

25

我有一些关于onTouchEvent()和onTouch()如何工作的疑惑(你可以看到我对这个问题的评论)。下面的一些研究是我发现的。这可能对初学者有帮助。

1)实施:

如果你想使用onTouch(),你必须做三两件事。

1-实施OnTouchListener上要设置捕捉事件

3-覆盖onTouch()来处理该事件

认为

2-通话setOnTouchListener(),但如果你想要使用onTouchEvent(),您不需要执行上述步骤1 & 2。只需要重写onTouchEvent()。

2)工作:

onTouch()适用于图,ViewGroup中,活动。意思是你可以在视图,视图组或活动中使用onTouch()。这个方法有两个参数[onTouch(View v,MotionEvent e)]。这允许您为活动或视图组中的不同视图过滤事件。或者活动本身可以处理它。 onTouchEvent()需要一个参数[onTouchEvent(MotionEvent e)]。因此,这只能在实现它的视图或派生视图内部使用。派生视图可以扩展onTouchEvent()中定义的触摸行为。

我认为,这样的选项是Android更灵活的开发理念的一部分,尽管它有时会给学习者带来困惑。

4

在创建自定义视图,您可以

@override onTouchEvent(MotionEvent e){}

,而您可以添加onTouch任何查看,ViewGroup中或活动。

onTouch(View v, MotionEvent e) { //you can filter any View's touch }

onTouch是通用的,是的onTouchEvent具体查看。你也可以使用onTouch过滤你的视图。

0

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

当然他们已经很老了,我们不应该使用它们。

这是Android的5.1 API 22.

0

的onTouchEvent是由视图活动和其他基类等的LinearLayout实现的方法..

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

您可以通过任何派生类覆盖此方法

onTouch()由接口定义OnTouchListener {}

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

所以只这个接口设置为一个类时需要实现一个