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()可以在任何类中使用,只要:
- 那个类(即Foo)实现了OnTouchListener接口
- 该类是使用
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是由View , Activity和其他基类(如LinearLayout 等)实现的一个方法。
public boolean onTouchEvent(MotionEvent event) { throw new RuntimeException("Stub!"); }
您可以通过任何派生类重写此方法
而
onTouch()由接口OnTouchListener {}定义
public interface OnTouchListener { boolean onTouch(View var1, MotionEvent var2); }
所以你只需要将这个接口设置为一个类就可以实现