android分析windowManager、window、viewGroup之间关系
2016-01-06 23:12
507 查看
本文将主要介绍addview方法,在windowManager、window、viewGroup中的实现原理。首先将介绍这些类结构关系,然后分析其内在联系,介绍实现原理,最后介绍重要的一个参数windowManager.layoutParams。
文章预计分为三个部分。
一、首先介绍一下上述接口、类的结构
接口:windowManager
用来在应用与window之间的管理接口,管理窗口顺序,消息等
public interface
WindowManager extends
android.view.ViewManager
抽象类:window
定义窗口样式和行为的抽象基类,用于作为顶层的view加到windowManager中。
唯一实现了这个抽象类的是PhoneWindow,实例化PhoneWindow需要一个窗口
public abstract class Window
其中有一个很重要的内部类
private class LocalWindowManager extends
WindowManagerImpl.CompatModeWrapper{...};
抽象类:viewGroup
包含其他view的容器,layouts和view 容器的基类。
public abstract class ViewGroup extends
View implements ViewParent, ViewManager
相关接口:ViewParent
定义了一个view parent 的要负责的功能以及view和parent view之间的关联
public interface ViewParent {
public void requestLayout();
public void createContextMenu(ContextMenu menu);
public void bringChildToFront(View child);
.....
}
viewManager
用来添加和移除activity中的view的接口
public interface
ViewManager
{
public void addView(View view, ViewGroup.LayoutParams params);
public void updateViewLayout(View view, ViewGroup.LayoutParams params);
public void removeView(View view);
}
二.他们之间的内在关系。
1. 对于view来说,添加到viewGroup中是通过addView();方式来实现的,在addView中实际上使用的是:
addViewInner(child, index, params, false);
流程是: 1.首先是对子View是否已经包含到一个父容器中
2.对子View布局参数的处理
3.调用addInArray来添加View
4.设置父View为当前的ViewGroup
5.焦点的处理
6.当前View的AttachInfo信息
7.View树改变的监听
8.子View中的mViewFlags的设置
主要是通过 addInArray添加view,添加的实现为system.arrayCopy(....);
[b] 2.[/b] 对于viewGroup来说,都会显示在在一个窗口中,每个都有一个父节点mParent,,最顶上的节点也是一个viewGroup,也就是decorView。
对于每个activity只有一个decorView也就是ViewRoot,只有一个window,window的获取是通过下面方法获取的。
在activity中使用setContentView(),其实是使用了 window.setContentView()完成的,window.setcontentView,
还是通过LocalWindowManager.addView(view, params)来实现的。这里LocalWindowManager是实现了WindowManagerImpl.CompatModeWrapper
,本质上就是WindowManager、viewManager接口中的addvidew方法。
3. 对于windowManager来说一个系统只有一个,它是由系统底层实现的,用于负责调度当前显示那个窗口,消息处理我们获得一个windowManager的方式如下:
这里windowManager其实是一个接口,而通过getSystemService的方式。通过这个方式可以获取很多的系统服务,比如电话、闹钟、电源管理等等。
同时windowManager和几个类之间的内在联系如下:
本节结束,下节讲述windowManager中WindowManager.layoutParams相关。
三.接上一节,分析windowManager中添加一个悬浮框的方式,首先看代码
params中一般参数都容易理解,这里有几个特别要注意的地方:type、flags、windowAnimation
1.对于type :
这里需要注意的地方是:
对于需要依附于activity的选择2000以下的,独立于activity,使用2002
2.对于flag,这里详细的说明
3.对于windowAnimation
很多人说为什么我设置了windowAnimation,但是没有动画效果呢?
这里一定要注意,这里需要使用style,在style中添加如下:
然后将style的resourceId赋给params.windowAnimation,如果是将动画的resourceId赋值给params.windowAnimation,死也看得不到动画效果滴。
欢迎转载,请标明出处。
文章预计分为三个部分。
一、首先介绍一下上述接口、类的结构
接口:windowManager
用来在应用与window之间的管理接口,管理窗口顺序,消息等
public interface
WindowManager extends
android.view.ViewManager
抽象类:window
定义窗口样式和行为的抽象基类,用于作为顶层的view加到windowManager中。
唯一实现了这个抽象类的是PhoneWindow,实例化PhoneWindow需要一个窗口
public abstract class Window
其中有一个很重要的内部类
private class LocalWindowManager extends
WindowManagerImpl.CompatModeWrapper{...};
抽象类:viewGroup
包含其他view的容器,layouts和view 容器的基类。
public abstract class ViewGroup extends
View implements ViewParent, ViewManager
相关接口:ViewParent
定义了一个view parent 的要负责的功能以及view和parent view之间的关联
public interface ViewParent {
public void requestLayout();
public void createContextMenu(ContextMenu menu);
public void bringChildToFront(View child);
.....
}
viewManager
用来添加和移除activity中的view的接口
public interface
ViewManager
{
public void addView(View view, ViewGroup.LayoutParams params);
public void updateViewLayout(View view, ViewGroup.LayoutParams params);
public void removeView(View view);
}
二.他们之间的内在关系。
1. 对于view来说,添加到viewGroup中是通过addView();方式来实现的,在addView中实际上使用的是:
addViewInner(child, index, params, false);
流程是: 1.首先是对子View是否已经包含到一个父容器中
2.对子View布局参数的处理
3.调用addInArray来添加View
4.设置父View为当前的ViewGroup
5.焦点的处理
6.当前View的AttachInfo信息
7.View树改变的监听
8.子View中的mViewFlags的设置
主要是通过 addInArray添加view,添加的实现为system.arrayCopy(....);
[b] 2.[/b] 对于viewGroup来说,都会显示在在一个窗口中,每个都有一个父节点mParent,,最顶上的节点也是一个viewGroup,也就是decorView。
对于每个activity只有一个decorView也就是ViewRoot,只有一个window,window的获取是通过下面方法获取的。
还是通过LocalWindowManager.addView(view, params)来实现的。这里LocalWindowManager是实现了WindowManagerImpl.CompatModeWrapper
,本质上就是WindowManager、viewManager接口中的addvidew方法。
3. 对于windowManager来说一个系统只有一个,它是由系统底层实现的,用于负责调度当前显示那个窗口,消息处理我们获得一个windowManager的方式如下:
同时windowManager和几个类之间的内在联系如下:
本节结束,下节讲述windowManager中WindowManager.layoutParams相关。
三.接上一节,分析windowManager中添加一个悬浮框的方式,首先看代码
1.对于type :
对于需要依附于activity的选择2000以下的,独立于activity,使用2002
2.对于flag,这里详细的说明
很多人说为什么我设置了windowAnimation,但是没有动画效果呢?
这里一定要注意,这里需要使用style,在style中添加如下:
欢迎转载,请标明出处。
相关文章推荐
- Android 对话框(Dialog)【大全】
- Android中图片剪裁时如何预防oom
- android Button源码分析
- Android ListView嵌套Button,Button事件覆盖item事件解决办法
- android骚年的年终总结和规划
- Android ProgressBar 样式【大全】
- android 连按两次退出程序
- 在android 中导入项目后 包出现错误
- Android输入法界面管理(打开/关闭/状态获取)
- Android 布局分析
- Android 通过串口模拟 模拟物理按键
- Android的SharedPreferences存储
- android camera:输出数据流和裁剪
- android动画的ZAdjustment
- Android 通过Intent调用系统功能和Action动作和服务广播【大全】
- [ApiDemos] Activity CustomDialog
- android开源项目总结
- android 传感器编程
- Android关于setExitTransition() 没有效果的问题
- Android之应用坐标系统全面详解