Android中 将布局文件/View显示至手机屏幕的 整个过程分析

下文中提到的窗口泛指我们所能看到的界面。例如,一个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<<featureId;

        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)。

DecorView根视图

源码:

privatefinal class DecorView extends FrameLayout {

//...

//触摸事件处理

@Override

    public boolean onTouchEvent(MotionEventevent) {

        return onInterceptTouchEvent(event);

    }

//...

}




三类综述:

Window类是载体(胶卷),PhoneView类是包装机器(打印机),DecorView类是视图内容(照片的内容)。

确定了照片里的内容后(要打印什么),再确定照片的属性(尺寸,打印时间,打印地点等),最后将照片打印在胶卷上。

二、请待下回更新。

参考网站:Android中将布局文件或View添加至窗口过程分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张之海

若有帮助,客官打赏一分吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值