下面是作者自己对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, 判断地方也挺多的
Android事件分发_第1张图片 标题

 Android事件分发_第2张图片

 

更多相关文章

  1. Android初学者学习之Android 屏幕适配2
  2. 2011.10.14(2)——— android 仿照微信的图片展示功能 之 放大超过
  3. VS2019中用xamarin开发Android,显示需要android sdk28的解决方法
  4. Android声音管理方法
  5. Android屏幕适配攻略
  6. Android中String资源文件的format方法

随机推荐

  1. 从Visual Studio 2012访问Netezza SQL数
  2. SQL标准从审核日志问题中选择当前记录
  3. Ms sql 2005 中的bit 数据类型
  4. SQL排成树状结构
  5. 这是快/最好?选择*或选择column1、colum2
  6. SQL0973N在 "" 堆中没有足够的存储器
  7. mysql优化---in型子查询,exists子查询,from
  8. MySql常用命令总结
  9. MYSQL 多表联合查询并分组的问题?
  10. mybatis中mysql多条件查询