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 ...
随机推荐
- MT【57】2017联赛一试解答倒数第二题:一道不等式的最值
注:康拓诺维奇不等式的应用
- 自学Linux Shell9.1-安装软件程序
点击返回 自学Linux命令行与Shell脚本之路 9.1-linux安装软件程序 PMS利用一个数据库来记录各种相关内容: Linux系统安装了什么软件包 每个包安装什么文件 每个已安装软件包的版本 ...
- Mysql 数据库 基础代码
-- 创建数据库 CREATE DATABASE book; -- 创建作者表 CREATE TABLE authors( Id int not NULL, -- 作者编号 Fname VARCHAR ...
- 【BZOJ3456】城市规划(生成函数,多项式运算)
[BZOJ3456]城市规划(生成函数,多项式运算) 题面 求\(n\)个点的无向连通图个数. \(n<=130000\) 题解 \(n\)个点的无向图的个数\(g(n)=2^{C_n^2}\) ...
- /dev/null与/dev/zero区别
/dev/null和/dev/zero的区别 /dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着! /dev/zero,是一个输入设备,你可你用它来初始化文件.该设备无穷尽 ...
- HDU 3605 Escape (网络流,最大流,位运算压缩)
HDU 3605 Escape (网络流,最大流,位运算压缩) Description 2012 If this is the end of the world how to do? I do not ...
- Android: 创建一个AlertDialog对话框,必须按确定或取消按钮才能关闭对话框,禁止按[返回键]或[搜索键]关闭
AlertDialog.Builder builder = new Builder(this); builder.create().show(); 这样显示出来的对话框,当用户按返回键或搜索键时,这个 ...
- 关于使用IsapiRewrite重写,重定向的语句
早上起床,发现之前的IsapiRewrite写法有改进的地方, 有几个废弃的网址可以使用IsapiRewrite的重定向,转到新的网址上来. 搞了有十分钟的时间,测试老是不重定向. 因为之前已经有一个 ...
- 13 款高逼格且实用的 Linux 运维必备工具
转载于民工哥技术之路 1. 查看进程占用带宽情况 - Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽. 下载:http://sourceforge.ne ...
- H5新特性之video audio
1.标签 <video src="~~~" autoplay loop controls controlslist="nodownload nofullscreen ...