同样,先总结后事例:
通过源码,我们知道ViewGroup继承了View,在触摸事件机制中,比View多了一个onInterceptTouchEvent的方法,正是这个方法实现了事件机制的拦截.从上章知,点击事件的机制是从获取焦点的View的onTouchEvent事件向外传递的.在此之前
会调用该
View所在的最外层Layout的onInterceptTouchEvent方法,由它来控制是否拦截该事件:
默认,我们不重写该方法,可直接在View的onTouchEvent监听事件,测试打印结果,默认onInterceptTouchEvent的Action_Down返回false.
由此可得onInterceptTouchEvent的Action_Down返回false时,不对View的onTouchEvent的Action_Down事件进行拦截.
当Layout的onInterceptTouchEvent的Action_Down返回true时,View的onTouchEvent监控不到任何事件;
事例如下:
ChildView.java(利用Action_Down返回true诱使后面的事件在无拦截的情况下被调用)
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.v("aa","ChildView::::ACTION_DOWN");
return true;
case MotionEvent.ACTION_MOVE:
Log.v("aa","ChildView::::ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.v("aa","ChildView::::ACTION_UP");
break;
default:
break;
}
return super.onTouchEvent(event);
}
Layout.java
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.v("aa","Layout::::ACTION_DOWN");
return true;
case MotionEvent.ACTION_MOVE:
Log.v("aa","Layout::::ACTION_MOVE");
return true;
case MotionEvent.ACTION_UP:
Log.v("aa","Layout::::ACTION_UP");
break;
default:
break;
}
return super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.v("aa","Layout::onInterceptTouchEvent::ACTION_DOWN");
// return true;
break;
case MotionEvent.ACTION_MOVE:
Log.v("aa","Layout::onInterceptTouchEvent::ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.v("aa","Layout::onInterceptTouchEvent::ACTION_UP");
break;
default:
break;
}
return super.onInterceptTouchEvent(ev);
}
运行如下:::
由上可知:当onInterceptTouchEvent拦截down为false的时候.ChildView的down被调用 并返回true,此时不向外传递 因此Layout的onTouchEvent的down没被调用.
修改onInterceptTouchEvent:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.v("aa","Layout::onInterceptTouchEvent::ACTION_DOWN");
return true;
// break;
case MotionEvent.ACTION_MOVE:
Log.v("aa","Layout::onInterceptTouchEvent::ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.v("aa","Layout::onInterceptTouchEvent::ACTION_UP");
break;
default:
break;
}
return super.onInterceptTouchEvent(ev);
}
运行如下:::
也就是,当它返回true的时候,对子布局进行拦截后,执行自己的onTouchEvent();同样Action_Down返回true,后续事件如Move,Up可运行;
至此,从onInterceptTouchEvent,onTouchEvent得出3条结论:
1.onTouchEvent由内向外传递,当Action_Down返回false的时候,表示向外声明自己不能解决 由外层再处理;同理,true表示自己已经有能力处理.不需要向外传递事件(此规律适用View,ViewGroup)
2.onTouchEvent只有当当Action_Down返回true的时候的时候(同时没被事件拦截)才会执行下续的MOVE,UP
3.onInterceptTouchEvent只有ViewGroup才有,在onTouchEvent前执行,无论是任何action,只有返回false(默认)的时候,才会传递事件给子控件,如果返回false.则屏蔽了子View的事件处理
,从该层的onTouchEvent开始处理起;
分享到:
相关推荐
android各组件详解- ViewGroup.pdf
L14-ViewGroup 的触摸反馈、ViewPager 和拖拽-讲义.pdf
Android ViewDragHelper完全解析 自定义ViewGroup神器 Android HandlerThread 完全解析 Android IntentService完全解析 当Service遇到Handler 详细 Android 高清加载巨图方案 拒绝压缩图片 ViewDragHelper实战 ...
仿DrawerLayout的ViewGroup ★1049 - 单手势滑出侧边栏与选择菜单 ★779 - 浮动菜单显示锚导航视图 ★525 - MD风格的自定义抽屉实现 ★514 - 侧滑菜单动画效果库 ★326 - 具有曲线边缘的NavigationView ★106 - 与QQ...
移动开发小白树懒,在努力的学习android基础.为自己学习的知识理一理思路.便于熟能生巧.
Listview多tab上滑悬浮Title.
自定义Viewgroup,其中包括三个listview,但拖拽中间listview的上部,3个listview一起运动。
这里收集了大家常用的一些Android代码,持续更新中,内容来自...通过重载 ViewGroup 的 dispatchDraw 可以实现一个简单的蒙版效果。 例如下拉刷新时,可以在 contentView 上加一层遮罩。 canvas.drawRect(0, mContentVi
18.View,ViewGroup事件分发 19.保存Activity状态 onSaveInstanceState() 7.http与https的区别 此处延伸:https的实现原理 23.自定义view和动画 以下两个讲解都讲得很透彻,这部分面试官多数不会问
仿DrawerLayout的ViewGroup ★1084 - 单手势滑出侧边栏与选择菜单 ★806 - 浮动菜单显示锚导航视图 ★538 - MD风格的自定义抽屉实现 ★533 - 侧滑菜单动画效果库 ★353 - 具有曲线边缘的NavigationView ★111 - 与QQ...
activity view window viewgroup的关系
自定义ViewGroup(高度不同的列表) MIT License Copyright (c) 2017 JiaoZhengXiang Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated ...
最近对自定义控件充满了兴趣,参考网上的视频写了一个流式布局的例子上传到这,和大家交流学习
它继承自ViewGroup 而不是FrameLayout或LinearLayout,提高了性能。 也吸取了现在流行的各种刷新布局的优点,包括谷歌官方的 , 其他第三方的 、 。 还集成了各种炫酷的 Header 和 Footer。 国内加速 github 由于...
ViewGroup.LayoutParams lp= new AbsoluteLayout.LayoutParams( WRAP_CONTENT, WRAP_CONTENT, (int)event.getRawX()-xSpan-X_MODIFY, (int)event.getRawY()-ySpan-Y_MODIFY ) ;
之前笔者其实已经写过事件分发机制的文章:[快速理解android事件传递拦截机制概念](http://blog.csdn.net/double2hao/article/details/51541061) 但是,现在看来其实更像是一篇知识概括,多出可能未讲清楚,于是打算...
安卓事件分发机制测试代码,事件传递从Activity-->ViewGroup-->View。dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent这三个函数的返回值不同,代表的事件传递的不同。
原文地址http://blog.csdn.net/android_cmos/article/details/52356229
ViewGroup:如果onInterceptTouchEvent返回false则不拦截,如果返回true则拦截当前事件。onInterceptTouchEvent方法我们返回了true,在这里就将事件拦截了,所以他不会继续分发给View(Button)了,反而交给自身的...
自定义ViewGroup---子View可对换位置