onTouchevent()vs onTouch()

时间:2011-02-15 09:49:10

标签: android ontouchlistener ontouchevent

在使用onTouchEvent和onTouch进行多次实验后,我发现onTouch可以在任何地方工作(无论是在活动中还是在视图中),只要您声明了接口并将Listener放在正确的位置即可!另一方面,onTouchEvent仅适用于View! 我的假设是否正确?这是真正的区别吗?

7 个答案:

答案 0 :(得分:41)

是的,您是正确的,onTouch()View用户用于获取触摸事件,而派生类<{1}} / strong> onTouchEvent()获取触摸事件。

答案 1 :(得分:29)

我对onTouchEvent()和onTouch()的工作方式有些困惑(你可以看看我对这个问题的评论)。经过以下一些研究后,我发现了它。这可能对初学者有所帮助。

1)实施:

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

1-实现OnTouchListener

在要设置的视图上调用setOnTouchListener()捕获事件

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

但如果您想使用onTouchEvent(),则无需执行步骤1&amp; 2以上。只需要覆盖onTouchEvent()。

2)工作:

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

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

答案 2 :(得分:5)

我使用了ontouch()和ontouchevent(),因为当我想在单个视图(例如Linearlayout)上处理单个视图的元素(如按钮,图像按钮等)时使用ontouch,而当我想在区域上工作时其余的我的元素(例如按钮)我使用ontouchevent。

答案 3 :(得分:4)

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

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

  1. 该类(即Foo)实现OnTouchListener接口和
  2. 该类是使用view.setOnTouchListener(foo);
  3. 的注册听众

答案 4 :(得分:4)

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

@override onTouchEvent(MotionEvent e){}

,您可以将onTouch添加到任何View,ViewGroup或Activity。

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

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

答案 5 :(得分:0)

我发现了另一个区别。 onTouchEvent似乎没有得到已弃用的事件MotionEvent.ACTION_POINTER_2_DOWN和MotionEvent.ACTION_POINTER_2_UP。

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

这是在Android 5.1 api 22中。

答案 6 :(得分:0)

onTouchEvent 是由查看活动和其他基类(如 LinearLayout ..

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

您可以通过任何派生类重写此方法

<强>而

onTouch()由界面 OnTouchListener {}

定义

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

所以你只需要在将这个接口设置为类

时实现一个