源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解

  • 时间:2020-05-18 00:59 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解
首先从字面意思理解两个词 [b]onTouchEvent:触发触摸事件[/b] [b]onInterceptTouchEvent:触发拦截触摸事件[/b] 通过查看源代码及类继承关系 onInterceptTouchEvent:是定义于ViewGroup里面的一个方法,此事件是用于拦截触摸事件的,ViewGroup(继承自View),一个View的Group,也就是我们的一个布局如LinerLayout,各个布局类都继承自ViewGroup; onTouchEvent:是定义于View中的一个方法,处理传递到View的手势触摸事件。手势事件类型包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL等事件; 其中ViewGroup里的onInterceptTouchEvent默认返回值是false,这样touch事件会传递到View控件,ViewGroup里的onTouchEvent默认返回值是false; View里的onTouchEvent默认返回值是true,当我们手指点击屏幕时候,先调用ACTION_DOWN事件,当onTouchEvent里返回值是true的时候,onTouch会继续调用ACTION_UP事件,如果onTouchEvent里返回值是false,那么onTouchEvent只会调用ACTION_DOWN而不调用ACTION_UP。 [b]1、新建两个类LLayout , LView 如下 [/b]
[u]复制代码[/u] 代码如下:
public class LLayout extends FrameLayout {  // ViewGroup  @Override  public boolean onInterceptTouchEvent(MotionEvent ev) {   Log.i("LTAG", "LLayout onInterceptTouchEvent");   Log.i("LTAG", "LLayout onInterceptTouchEvent default return" + super.onInterceptTouchEvent(ev));   return super.onInterceptTouchEvent(ev);  }  // View  @Override  public boolean onTouchEvent(MotionEvent event) {   Log.i("LTAG", "LLayout onTouchEvent");   Log.i("LTAG", "LLayout onTouchEvent default return" + super.onTouchEvent(event));   return super.onTouchEvent(event);  } } public class LView extends Button {  // TextView <-- View  @Override  public boolean onTouchEvent(MotionEvent event) {   Log.i("LTAG", "onTouchEvent");   Log.i("LTAG", "onTouchEvent default return" + super.onTouchEvent(event));   return super.onTouchEvent(event);  } }
[b] 2、修改布局文件为如下布局 [/b] 
[u]复制代码[/u] 代码如下:
 <com.touchpro.LLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:layout_width="match_parent"   android:layout_height="match_parent" >   <com.touchpro.LView     android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:text="@string/app_name" /> </com.touchpro.LLayout>  
(1)先点击界面中的按钮 [img]http://files.jb51.net/file_images/article/201304/20130419172743133.jpg[/img] (2)再点击界面中的其它区域 [img]http://files.jb51.net/file_images/article/201304/20130419172743134.jpg[/img] 结论:LLayout 中 onInterceptTouchEvent 默认返回值为false,onTouchEvent 默认返回值为false,所以只调用了ACTION_DOWN事件; LView中 onTouchEvent 默认返回值为true;调用了ACTION_DOWN,ACTION_UP 两个事件; [b](3)修改LLayout中onInterceptTouchEvent返回值为true,再次运行代码: [/b][img]http://files.jb51.net/file_images/article/201304/20130419172743135.jpg[/img] 结论:LLayout中onInterceptTouchEvent返回了true,对触摸事件进行了拦截,所以没有将事件传递给View,而直接执行了LLayout中的onTouchEvent事件; [b](4)把LLayout中onInterceptTouchEvent返回值改为false,再把LView中的onTouchEvent改为返回false: [/b][img]http://files.jb51.net/file_images/article/201304/20130419172743136.jpg[/img] 结论:由于将LView中onTouchEvent返回值修改为false,因此只执行了ACTION_DOWN,然后就到LLayout中执行onTouchEvent事件了; [b]ViewGroup里的onInterceptTouchEvent默认值是false这样才能把事件传给View里的onTouchEvent.[/b] [b]ViewGroup里的onTouchEvent默认值是false。[/b] [b]View里的onTouchEvent返回默认值是true.这样才能执行多次touch事件。[/b]
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部