Android UI绘制流程及原理 一

本文以setContentView(R.layout.activity_main)为入口,分析Android中View添加到屏幕窗口的流程。通过点击进入相关方法,如getWindow、installDecor等,介绍了从抽象类Window到其实现类PhoneWindow的操作,包括创建顶层布局容器DecorView、加载基础布局等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

我们分析的入口:

setContentView(R.layout.activity_main);

点击进入setContentView

public void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID); initWindowDecorActionBar(); }

点击进入getWindow

(因为调用的是getWindow().setContentView)
public Window getWindow() { return mWindow; }

点击进入Window查看到

可以看到这是一个抽象类,从注释中可以看到PhoneWindow是Window的实现类。

进入PhoneWindow

找到setContentView这个方法

在这里插入图片描述

查看installDecor()方法

在这里插入图片描述
if (mDecor == null) { mDecor = generateDecor(-1);
generateDecor(-1)方法得到
new DecorView(context, featureId, this, getAttributes());
在这里插入图片描述

查看DecorView

public class DecorView extends FrameLayout implements RootViewSurfaceTaker, WindowCallbacks
DecorView继承于FrameLayout

回到上面的PhoneWindow的installDecor方法

mContentParent = generateLayout(mDecor);
找到该方法点击进入generateLayout方法,这个方法里设置了很多根据主题什么设置了一堆熟悉过
在这里插入图片描述
核心代码如下
这块代码是把不同主题布局添加到DecorView
mDecor.onResourcesLoaded(mLayoutInflater, layoutResource);

主布局ID
onResourcesLoaded方法详情
在这里插入图片描述
下面这块代码是根据主布局Id来获取主布局
ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);
contentParent就是我们要设置我们自己布局的父布局了。

代码展示如下 再回到PhoneWindow的setContentView方法

在这里插入图片描述

综上所述:View是如何添加到屏幕窗口上

  1. 创建顶层布局容器DecorView
  2. 在顶层布局中加载基础布局ViewGroup
  3. 将ContentView添加到基础布局中的FrameLayout中

图解如下:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值