View的事件分发和工作机制
2016-05-07 10:52
337 查看
View 的工作原理
ViewRoot和DecorView
1.ViewRoot对应ViewRootImpl类,它是连接WindowManager和DecorView的纽带,View的三大流程均通过ViewRoot来完成。
2.ActivityThread中,Activity创建完成后,会将DecorView添加到Window中,同时创建ViewRootImpl对象,并建立两者的关联。
3.View的绘制流程从ViewRoot的performTraversals方法开始,经过measure、layout和draw三大流程。
事件分发,就是对MotionEvent事件的分发过程,系统把这个事件传递给一个具体的View,而这个传递的过程就是分发的过程。
三个方法:
dispatchTouchEvent:用来进行事件的分发,如果事件能够传递给当前View,那么此方法一定会被调用,返回结果受当前View的onTouchEvent和View的dispatchTouchEvent方法的影响,表示是否当消耗当前事件
onInterceptTouchEvent:用来判断是否拦截某个事件,如果当前View拦截了某个事件,那么在同一个事件序列当中,此方法不会被再次调用,返回结果表示是否拦截当前事件;
onTouchEvent:在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前View**无法再次**接收到事件。
Activity对事件的分发过程
Activity -> Window -> DecorView。
Windows是一个抽象类,可以控制顶级View的外观和行为策略,PhoneWindow是这个类的唯一个实现。
DecorView就是当前界面的底层容器,即setContentView所设置的View是它的一个子View。
顶级View对点击事件的分发过程
ViewGroup -> dispatchTouchEvent -> onInterceptTouchEvent -> onTouch or onTouchEvent
顶级View一般都是一个ViewGroup。拦截事件之后,如果ViewGroup设置了mOnTouchListener,则Listener里的onTouch方法会屏蔽掉onTouchEvent。如果onTouchEvent设置了mOnClickListener,则Listener里的onClick会被调用。如果ViewGroup没有拦截则传给子View直到整个事件分发完成。
View如果没有onInterceptTouchEvent方法,一旦有点击事件传递给他,他就会处理。
事件分发顺序(从顶至下,再由下至顶)
当一个点击事件产生后,它的传递过程如下:Activity -> Window -> View。如果View的onTouchEvent返回false,那么它的父容器onTouchEvent将会被调用,以此类推,最终将由Activity的onTouchEvent处理。
View的工作流程:
onMeasure, onLayout, onDraw
自定义View:
1.直接继承View或ViewGroup的需要自己处理wrap_content。(onMeasure)
2.View要在onDraw方法中要处理padding,而ViewGroup要在onMeasure和onLayout中处理padding和margin。
3.View中的post方法可以取代handler。
4.在View的onDetachedFromWindow中停止动画,线程或回收其他资源。
5.滑动冲突处理。有三种方式实现:
1)scroller 内容滑动
2)动画
3)LayoutParams
ViewRoot和DecorView
1.ViewRoot对应ViewRootImpl类,它是连接WindowManager和DecorView的纽带,View的三大流程均通过ViewRoot来完成。
2.ActivityThread中,Activity创建完成后,会将DecorView添加到Window中,同时创建ViewRootImpl对象,并建立两者的关联。
3.View的绘制流程从ViewRoot的performTraversals方法开始,经过measure、layout和draw三大流程。
事件分发,就是对MotionEvent事件的分发过程,系统把这个事件传递给一个具体的View,而这个传递的过程就是分发的过程。
三个方法:
dispatchTouchEvent:用来进行事件的分发,如果事件能够传递给当前View,那么此方法一定会被调用,返回结果受当前View的onTouchEvent和View的dispatchTouchEvent方法的影响,表示是否当消耗当前事件
onInterceptTouchEvent:用来判断是否拦截某个事件,如果当前View拦截了某个事件,那么在同一个事件序列当中,此方法不会被再次调用,返回结果表示是否拦截当前事件;
onTouchEvent:在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前View**无法再次**接收到事件。
public boolean dispatchTouchEvent(MotionEvent ev) { boolean consume = false; if(onInterceptTouchEvent(ev)) { consume = onTouchEvent(ev); } else { consume = child.dispatchTouchEvent(ev); } return consume;
Activity对事件的分发过程
Activity -> Window -> DecorView。
Windows是一个抽象类,可以控制顶级View的外观和行为策略,PhoneWindow是这个类的唯一个实现。
DecorView就是当前界面的底层容器,即setContentView所设置的View是它的一个子View。
顶级View对点击事件的分发过程
ViewGroup -> dispatchTouchEvent -> onInterceptTouchEvent -> onTouch or onTouchEvent
顶级View一般都是一个ViewGroup。拦截事件之后,如果ViewGroup设置了mOnTouchListener,则Listener里的onTouch方法会屏蔽掉onTouchEvent。如果onTouchEvent设置了mOnClickListener,则Listener里的onClick会被调用。如果ViewGroup没有拦截则传给子View直到整个事件分发完成。
View如果没有onInterceptTouchEvent方法,一旦有点击事件传递给他,他就会处理。
事件分发顺序(从顶至下,再由下至顶)
当一个点击事件产生后,它的传递过程如下:Activity -> Window -> View。如果View的onTouchEvent返回false,那么它的父容器onTouchEvent将会被调用,以此类推,最终将由Activity的onTouchEvent处理。
View的工作流程:
onMeasure, onLayout, onDraw
自定义View:
1.直接继承View或ViewGroup的需要自己处理wrap_content。(onMeasure)
2.View要在onDraw方法中要处理padding,而ViewGroup要在onMeasure和onLayout中处理padding和margin。
3.View中的post方法可以取代handler。
4.在View的onDetachedFromWindow中停止动画,线程或回收其他资源。
5.滑动冲突处理。有三种方式实现:
1)scroller 内容滑动
2)动画
3)LayoutParams
相关文章推荐
- Android 用户定位
- AOJ 0118: Property Disribution(dfs)
- hihoCoder挑战赛20-题目2 : 展胜地的鲤鱼旗 -DP/分治
- Android三种XML解析
- hdu 4291 矩阵快速幂+找循环节
- DS-5 Development Studio
- HDU 3853 LOOPS (概率DP)
- 飛飛(三十三)深复制体验
- 百度地图API之JavaScript 开源库1
- static关键字的使用总结
- 关于在C#中对类中的隐藏基类方法和重写方法的理解
- 关键字搜索十次存memcache
- XMG 绘制形状
- 工欲善其事必先利其器
- java远程调用
- Android 6.0 中新的新技术
- UGUI富文本
- 你曾后悔进入 IT 行业吗?为什么?
- Git提交代码常用命令
- JavaScript的Backbone.js框架入门学习指引