onTouchevent()vs onTouch()

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

是的,你是正确的 – onTouch()用户使用onTouch()来获取触摸事件,而onTouchEvent()派生类使用onTouchEvent()来获得触摸事件。

我有一些与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) ]。 因此,这只能在实现它的视图或派生视图中使用。 派生View可以扩展onTouchEvent()中定义的触摸行为。

我认为,这样的select是Android更灵活的开发哲学的一部分,虽然它有时会给学习者造成混乱。

我已经使用ontouch()和ontouchevent(),因为ontouch是用于当我想单视图的元素,如button,imagebuttons等单视图(说Linearlayout),而当我想工作的地区其余的我的元素(例如button)我使用ontouchevent。

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

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

  1. 那个类(即Foo)实现了OnTouchListener接口
  2. 该类是使用view.setOnTouchListener(foo);的已注册侦听器view.setOnTouchListener(foo);

在创build自定义视图时,您可以

@override onTouchEvent(MotionEvent e){}

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

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

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

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

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

这是在Android 5.1 API 22。

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

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

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

onTouch()由接口OnTouchListener {}定义

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

所以你只需要将这个接口设置为一个类就可以实现