欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > Android >内容正文

Android

Android中的Touch事件处理流程

发布时间:2023/12/1 Android 75 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Android中的Touch事件处理流程 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
1、当触摸屏幕时,最先执行的是Activity中的      public boolean dispatchTouchEvent (MotionEvent ev) {         if (ev.getAction() == MotionEvent. ACTION_DOWN) {             onUserInteraction();         }         if (getWindow().superDispatchTouchEvent(ev)) {             return true;         }         return onTouchEvent(ev);     } 如果某些事件无法监测到,可以重写此方法,优先处理ev,然后再调用super.dispatchTouchEvent。
2、Activity中的onTouchEvent的调用时机如下:当Activity下的所有view的onTouchEvent都返回false时(都不处理touch事件,默认返回false),才会调用Activity中的onTouchEvent。
因此,该事件主要用于点击视图的外围,无view的空白处。
另外,从view里的onTouchEvent代码可以看出,如果view设置了clickable = true,则会返回true,消耗此次Touch事件。          if (((viewFlags & CLICKABLE) == CLICKABLE ||                 (viewFlags & LONG_CLICKABLE ) == LONG_CLICKABLE)) {             switch (event.getAction()) {                。。。。             }             return true;         } 3、 第一种情况:父viewgroup的onInterceptTouchEvent中,返回默认值,同时子view中也返回默认值:


可以看到,由activity进行dispatchTouchEvent,但是并不调用activity中的Touchevetnt,而是传递到最外层viewgroup中,调用onInterceptTouchEvent,其返回false,因此继续向下传递,一直到view。然后view调用onTouchEvent,并返回默认值false。 onTouchEvent再从内向外调用,直到最外层的viewgroup。最后调用activity的onTouchEvent。 注:当手指抬起时,dispatchTouchEvent不再像下传递,因此viewgroup和子view都不再相应,此时activity的onTouchEvent相应ActionUp事件。(问题的根源在于view返回false,表示不再接受下一个事件)
第二种情况:父viewgroup的onInterceptTouchEvent中,返回默认值,同时子view中返回true:

可以看到,当ActionDown传递到子view中时,子view返回true。表示消费了此事件,因此ontouchEvent不再传递到父viewgroup以及activity。当ActionUp传递时亦然。因此从子view的角度看,无需对父view进行任何设置,相当于子view直接与手指对话。
第三种情况:父viewgroup的onInterceptTouchEvent中,返回true,同时子view中返回true:


可以看到,如果父viewgroup在onInterceptTouchEvent中返回true,其子viewgrou的onInterceptTouchEvent不会被调用,子view的onTouchEvent也不会被调用。从而对其子视图进行了拦截。从子视图角度看其onTouchEvent方法不会被调用,而Activity的onTouchEvent则可以被调用。 注:Activity的onTouchEvent的优先级是最低的。
最后,反过来看第1条,当子view消耗touch事件时,会直接使getWindow().superDispatchTouchEvent(ev)返回true,因此不再调用activity的onTouchEvent。         if (getWindow().superDispatchTouchEvent(ev)) {             return true;         }

转载于:https://www.cnblogs.com/tanqiantot/archive/2013/06/05/3126810.html

总结

以上是生活随笔为你收集整理的Android中的Touch事件处理流程的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。