下文中提到的窗口泛指我们所能看到的界面。例如,一个Activity呈现的界面,一个Dialog,一个Toast,一个Menu菜单等。
一、首先,对与该过程相关的类做一下介绍:
1. Window类
位置:位于/frameworks/base/core/java/android/view/Window.java
简介:该类是抽象类,提供了一组绘制窗口的API。
可以将其看作一个载体,各种view在这个载体上显示。
源码(部分):
public abstract class Window {
//...
//指定Activity窗口的风格类型
public static final int FEATURE_NO_TITLE =1;
public static final intFEATURE_INDETERMINATE_PROGRESS = 5;
//设置布局文件
public abstract void setContentView(intlayoutResID);
public abstract void setContentView(Viewview);
//请求指定Activity窗口的风格类型
public boolean requestFeature(intfeatureId) {
final int flag = 1<
mFeatures |= flag;
mLocalFeatures |=mContainer != null ? (flag&~mContainer.mFeatures) : flag;
return (mFeatures&flag) != 0;
}
//...
}
2. PhoneWindow类
位置:/frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindow.java
简介:
该类继承了Window抽象类,是Window抽象类的具体实现,我们可以通过该类绘制窗口。
该类内部有一个DecorView对象(Decor:装饰,布置。Decor View即修饰 视图,因为DecorView继承了FrameLayout并进行了一些功能扩展,后面将详细介绍)此DecView对象是所有应用窗口(Activity界面,即Layout布局)的根View。
所以,形象点说,PhoneView类是一个包装机器,他把DecorView对象进行一定的包装,将它作为窗口的根View。并且,PhoneView还提供了一组通用的对窗口的操作接口。
源码:
public class PhoneWindow extends Window implements MenuBuilder.Callback {
//...
// This is the top-level view of the window, containing the windowdecor.
private DecorViewmDecor; //该对象是所有应用窗口的根视图 , 是FrameLayout的子类
//该对象是Activity布局文件的父视图,一般来说是一个FrameLayout型的ViewGroup
// 同时也是DecorView对象的一个子视图
// This is the view in which the windowcontents are placed. It is either
// mDecor itself, or a child of mDecorwhere the contents go.
private ViewGroup mContentParent;
//设置标题
@Override
public void setTitle(CharSequence title) {
if (mTitleView != null) {
mTitleView.setText(title);
}
mTitle = title;
}
//设置背景图片
@Override
public final voidsetBackgroundDrawable(Drawable drawable) {
if (drawable != mBackgroundDrawable ||mBackgroundResource != 0) {
mBackgroundResource = 0;
mBackgroundDrawable = drawable;
if (mDecor != null) {
mDecor.setWindowBackground(drawable);
}
}
}
//...
}
3. DecorView类
位置:PhoneView的抽象类。
简介:所有应用窗口的根View,该类继承了FrameLayout类,对普通的FrameLayout类进行了功能的扩展(或者说是“修饰”,Decor:修饰,布置)。 比如说,添加标题栏(TitleBar)。
源码:
privatefinal class DecorView extends FrameLayout {
//...
//触摸事件处理
@Override
public boolean onTouchEvent(MotionEventevent) {
return onInterceptTouchEvent(event);
}
//...
}
三类综述:
Window类是载体(胶卷),PhoneView类是包装机器(打印机),DecorView类是视图内容(照片的内容)。
确定了照片里的内容后(要打印什么),再确定照片的属性(尺寸,打印时间,打印地点等),最后将照片打印在胶卷上。
二、请待下回更新。
参考网站:Android中将布局文件或View添加至窗口过程分析