Activity Window View WindowManager关系&Touch事件分发机制
http://www.cnblogs.com/linjzong/p/4191891.html
https://www.cnblogs.com/kest/p/5141817.html
https://blog.csdn.net/qq_21399461/article/details/79836806
Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
Android事件传递之onInterceptTouchEvent()和requestDisallowInterceptTouchEvent()方法的使用 :讲解requestDisallowInterceptTouchEvent()的调用时机
以下便是ScrollView捕获滑动事件的原理(嵌套ListView时拦截了Action_Move事件)
假如我们在某个ViewGroup的onInterceptTouchEvent中,将Acion为Down的Touch事件都返回false,其他的都返回True,这种情况下,Down事件能正常分发,若子View都返回false,那mTarget还是为空,无影响。若某个子View返回了true,mTarget被赋值了,在Action_Move和Aciton_UP分发到该ViewGroup时,便会给mTarget分发一个Action_Cancel的MotionEvent(mTarget收到Action_Cancel后,做一些善后操作,基本和收到Aciton_UP时所做的善后操作一样),同时清空mTarget的值,使得接下去的Action_Move(如果上一个操作不是UP)将由ViewGroup的onTouchEvent处理。
1.Activity 可以说是应用程序的载体(也可以理解为界面的载体,但不是界面),用户能够在上面绘制界面(Activity本身不绘制界面),并提供用户处理事件的API,维护应用程序的生命周期(Android应用程序是由多个 Activity 堆积而成,而各个 Activity 又有其独立的生命周期)。
Window和View的关系
window是一个界面的窗口(唯一的实现类是PhoneWindow),是存放view的容器,即Window是View的管理者,或者说是附着在Window上的。Android中所有的视图都是通过Window来呈现的,比如Activity,Dialog,Toast,他们的视图都是附着在Window上的。比如我们常用的弹出对话框时,把背景变暗,就是通过设置Window的alpha值来实现的。Window的添加、删除和更改是通过WindowManager来实现的。而WindowManager又是继承ViewManager的。ViewManager是一个接口有三个方法:addView updateViewLayout removeView。
可见WindowManager也是一个接口,它的具体实现类是WindowManagerImpl。WindowManagerImpl是一个代理对象,它的addView,removeView和updateView都是通过WindowManagerGlobal实现的。WindowManagerGlobal内部最终是通过WindowManagerService来创建Window的。
Activity与Window的关系
Activity是向用户展示一个界面,并可以与用户进行交互。Activity内部持有一个Window对象,用来管理View。由此可知,window就像是Activity的一个手下,为Activity管理View,就连事件的分发,也是Activity先发给Window,然后window转给DecorView,从而进入View体系向下分发。
Window与WindowManager
Window相关的主要有以下几个类、接口: https://blog.csdn.net/u014606081/article/details/69400241
Window抽象类、Window.Callback接口,WindowManager接口、ViewManager接口、WindowManagerImpl实现类、WindowManagerGlobal类、ViewRootImpl类。
先把这几个类的作用、特性、工作流程总结一下,捋一捋思路,然后再去分析每个类,这样思路会更清晰。
1、Window表示一个窗口的概念,只有一个唯一实现类PhoneWindow,所有的能让用户看到的组件都是通过Window来展现的,Window规定了UI的展现方式、接收用户的触摸等交互,然后传给各个组件;这些组件通过实现Window.Callback接口,就可以接受到Window的通知了;
2、Window持有一个WindowManager对象,该对象的主要作用就是帮助Window完成部分功能实现,比如添加View、删除View(ViewManager定义了添加、删除View,WindowManager继承自ViewManager);
3、WindowManagerImpl就是WindowManager的具体实现(非唯一实现),大部分功能都在这里完成。除了完成自己的本职工作外,WindowManagerImpl还要将Window和View的显示通知给系统,所以这个类持有一个WindowManagerGlobal对象,该对象是单例、全局存在,的主要作用就是对Window和View的全局管理;
4、WindowManagerGlobal做两件事,一件是添加/删除/更新View(真正的执行者是ViewRootImpl),另一件就是通过List管理着所有View、ViewRootImpl、LayoutParamas等。而ViewRootImpl则通过performTraversals()发起View的绘制流程。
5、Activity通过new PhoneWindow()得到Window,通过getSystemService()得到WindowManager,通过mWindow.setWindowManager()方法使Window和WindowManager绑定,通过实现Window.Callback接口接收Window的通知。
to read https://www.cnblogs.com/xunzhi/p/5671337.html
https://www.cnblogs.com/ldq2016/p/6672010.html
https://www.jianshu.com/p/8766babc40e0
Activity Window View WindowManager关系&Touch事件分发机制的更多相关文章
- Activity Window View的关系
http://blog.csdn.net/chiuan/article/details/7062215 http://blog.163.com/fenglang_2006/blog/static/13 ...
- Android开发之Touch事件分发机制
原地址http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实 ...
- Android事件分发机制(二)30分钟弄明白Touch事件分发机制
Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...
- Android:30分钟弄明白Touch事件分发机制
Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...
- 【转】Android:Touch事件分发机制
Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...
- Android的Touch事件分发机制简单探析
前言 Android中关于触摸事件的分发传递是一个很值得研究的东西.曾不见你引入了一个ListView的滑动功能,ListView就不听你手指的指唤来滚动了:也不知道为啥Button设置了onClic ...
- Touch事件分发机制
原文:http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实 ...
- Android Touch事件分发机制学习
Android 事件分发机制 ViewGroup dispatchTouchEvent 返回true dispatchTouchEvent: Activity ACTION_DOWN Myrelat ...
- Android Touch事件分发机制
参考:http://blog.csdn.net/xiaanming/article/details/21696315 参考:http://blog.csdn.net/wangjinyu501/arti ...
随机推荐
- Uva10474-STL水题-白书
白书的一道水题.话说好久没认真做难题了.今天出了排名,所有队伍里倒数第一啊! 代码没什么可说的了. #include <algorithm> #include <cstring> ...
- hg和git命令对照表
hg和git命令对照表 来源 https://github.com/sympy/sympy/wiki/Git-hg-rosetta-stone Git hg rosetta stone muxat ...
- 自学Python6.1-模块简介
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- 【转】typedef和#define的用法与区别
typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: ...
- 洛谷 P1452 Beauty Contest 解题报告
P1452 Beauty Contest 题意 求平面\(n(\le 50000)\)个点的最远点对 收获了一堆计算几何的卡点.. 凸包如果不保留共线的点,在加入上凸壳时搞一个相对栈顶,以免把\(n\ ...
- P3507 GRA-The Minima Game
题目大意: 给出N个正整数,AB两个人轮流取数,A先取.每次可以取任意多个数,直到N个数都被取走.每次获得的得分为取的数中的最小值,A和B的策略都是尽可能使得自己的得分减去对手的得分更大.在这样的情况 ...
- IntelliJ IDEA的使用操作链接
一:IntelliJ IDEA导入多个eclipse项目到同一个workspace下: http://www.cnblogs.com/ThinkVenus/p/6783961.html?utm_sou ...
- maven项目检出后报错(包括编译报错和运行报错)的常见检查处理方式
maven项目检出后报错(包括编译报错和运行报错)的常见检查处理方式: 1.更改项目的jdk为我们安装的jdk2.更改build配置里的 output folder 目录为 xxx项目名/target ...
- NOIP 普及组 2016 回文日期
传送门 https://www.cnblogs.com/violet-acmer/p/9859003.html 题解: 思路1: 相关变量解释: year1,month1,day1 : date1对应 ...
- C# 多窗体之间方法调用
看似一个简单的功能需求,其实很多初学者处理不好的,很多朋友会这么写: //父窗体是是frmParent,子窗体是frmChildA //在父窗体中打开子窗体 frmChildA child = new ...