下面是作者自己对Android开发的一个理念的理解
Android 作为前端和客户交互一个产品app
总体是 需要处理 View的一个自定义绘制
需要处理 客户与手屏幕触摸事件分发
需要处理 Java处理数据和设计理念
需要处理 Android 和 JAVA 集合部分
自己有感而发的 : 你不理解或者能理解我说了什么 自己体会吧
Android 事件分发机制
事件传递
Activity --> Window --->DecorView ---> ViewGroup --> View
什么是事件分发?
现在人们在使用手机时,都会通过手指对屏幕的触摸来完成交互过程
对app是有多个页面实现的,每个页面是通过Activity承载的,
在Activity上包含若干个ViewGroup和View,
用户通过屏幕与手机交互的时候,每一次点击,长安,移动定都是一个事件.
事件分发机制: 某一个事件从屏幕传递各个View,由View来使用这一事件(消费事件)或者忽略这一事件(不消费事件)
这整个过程的控制
所以所谓事件分发就是将事件传递到每个View的过程.这样一个概念转化成java面向对象就是封装成MotionEvent对象,
分发过程就是分发MotionEvent的过程
MotionEvent 通过事件类型有很多,我们一般主要使用使用这个4个,
按下 (ACTION_DOWN)
移动 (ACTION_MOVE)
抬起 (ACTION_UP)
取消 (ACTION_CANCEL)
事件序列
手指按下屏幕开始,到手指离开屏幕所产生的一些列事件
首先产生action_down 事件 然后产生了action_move 再然后产生了action_up
最后产生了action_cancel这些组合就是事件序列.
指明这里的屏幕是指Activity,
Activity不负责视图控制,它只负责生命周期,和处理事件
真正控制视图的是一个Window是个抽象类代表了一个窗口,
每一个Activity引用了一个Window对象,而Window是一个抽象类所以是用它子类PhoneWindow创建指向父类Window引用的
而在Window之中还包含了一个DecorView, DectorView是Activity的顶级View,其中Activity setContentView是添加
给DecorView的子元素,当我们事件都是通过DecorView传递我们子View.
而DecorView继承了ViewGroup,所以事件又通过ViewGroup分发,分发到我们创建的一个个子的ViewGroup和View
所以事件主要传递对象及顺序是 Activity ViewGroup View 这三个会按照上面所说的传递层级
Activity :处理
1.dispatchTouchEvent(MotionEvent ev);
2.onTouchEvent(MotionEvent event);
事件在Activity中调用dispatchTouchEvent分发之中就会调用onTouchEvent
这两个方法都会接口MotionEvent对象,
如图片:Activity事件分发.jpg图片查看流程
注意: dispatchTouchEvent调用onTouchEvent 之前回去ViewGroup 执行ViewGroup的disPatchTouchEvent方法
如果返回true 就不知执行Activity.onTouchEvent方法了
ViewGroup :处理
1.disPatchTouchEvent(MotionEvent ev);
2.onInterceptTouchEvent(MotionEvent ev);
*3.onTouchEvent(MotionEvent event); //当前ViewGroup是没有这个方法,这个方法在ViewGroup父类View中的
事件如果进入到ViewGroup中首先会调用dispatchTouchEvent方法分发,
onInterceptTouchEvent方法会在dispatchTouchEvent中调用,
如果返回true就是表示事件拦截了不会在下发了,如果false就是不会拦截当前dispatchTouchEvent分发的事件
onTouchEvent 方法不在ViewGroup中,为什么要使用这个那?
是因为如果我们自定义了ViewGroup想让事件自己处理 就可以调用onInterceptTouchEvent方法返回true
然后重写View中的onTouchEvent方法处理掉事件
如图片:ViewGroup事件分发.jpg图片查看流程
注意 : dispatchTouchEvent 里面只调用了onInterceptTouchEvent 方法, ViewGroup中没有onTouchEvent方法
onTouchEvent是父类View中的方法
ViewGroup事件分发中源码中代码很多, 其中有代码判断触摸事件是否符合安全策略
如果返回false,事件就会跳过所有方法直接返回false,事件就未消费了
如果返回true,事件就会去调用onInterceptTouchEvent是否会拦截了, 如果返回true就重写View中的onTouchEvent方法了
自己处理事件消费了,如果返回false 就是不拦截 然后把事件传给子的ViewGroup或View了
View : 处理
1.dispatchTouchEvent(MotionEvent ev);
2.onTouchEvent(MotionEvent event);
如果事件进入View首先调用dispatchTouchEvent方法分发 然后判断这个View是否有可响应的焦点,如果返回false
就会跳过所以方法直接结束,如果返回true 就是可响应然后在调用 安全策略方法 如果返回false也直接结束,如果返回
true 会接判断此事件是否为鼠标事件,如果是true 会返回true,事件消费结束,如果返回false ,会注册TouchListener监听
onTouch()方法值,true,会返回true,事件消费结束,如果false 会监听onTouchEvent返回值,true,会返回true,事件消费结束,如果false
返回fasle ,事件未消费 结束
图片:View事件分发.jpg 流程图
注意 : View中处理 分发, 焦点,安全策略,鼠标,监听TouchListener.onTouch()值,onTouchEvent, 判断地方也挺多的
标题