View的绘制起点(读源码)笔记

本文通过分析源码探讨了Android中View的绘制起点,解释了为何在onCreate或onResume时无法获取到View的准确宽高。从ActivityThread的handleLaunchActivity开始,经过onCreate、onResume,直到addView方法调用,才开始进行View的测量、布局和绘制。重点在于理解performTraversals()方法在View绘制过程中的关键作用。
摘要由CSDN通过智能技术生成

在写代码的时候,因为功能、需求等,需要知道一个控件的宽高,demo如下:

<TextView
    android:id="@+id/text_view"
    android:layout_width="50dp"
    android:layout_height="50dp"/>

Activity中

TextView text_view;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_5);

    text_view= (TextView) findViewById(R.id.text_view);
    Log.e("onCreate==getMeasuredWidth",text_view.getMeasuredWidth()+"");
    Log.e("onCreate==getWidth",text_view.getWidth()+"");
}

@Override
protected void onResume() {
    super.onResume();
    Log.e("onResume==getMeasuredWidth",text_view.getMeasuredWidth()+"");
    Log.e("onResume==getWidth",text_view.getWidth()+"");
}

日志:

E/onCreate==getMeasuredWidth: 0
E/onCreate==getWidth: 0
E/onResume==getMeasuredWidth: 0
E/onResume==getWidth: 0

说明了,在界面上看到布局的时候,还拿不到view的宽高。接下来,(在onCreate中)添加个方法监听

text_view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {

    Log.e("getMeasuredWidth",text_view.getMeasuredWidth()+"");
    Log.e("getWidth",text_view.getWidth()+"");

    }
});

日志

E/onCreate==getMeasuredWidth: 0
E/onCreate==getWidth: 0
E/onResume==getMeasuredWidth: 0
E/onResume==getWidth: 0
E/getMeasuredWidth: 150
E/getWidth: 150

说明了,绘制(加载)完才能拿到控件的宽高。而在onResume中,控件还没有绘制(加载)。

那么,view是什么时候开始绘制的?

在说明view的绘制之前,我想先说一下,onCreate的流程。算是扩展的知识点吧

在之前的handler源码分析中,我提到了ActivityThread,里面有个handler处理,会处理Activity的各种状态,接下来,去那里的源码看看。这里,我只拿出来onCreate和onResume相关的

public void handleMessage(Message msg) {
    if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
    switch (msg.what) {
        case LAUNCH_ACTIVITY: {
            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
            final ActivityClientRecord r = (ActivityClientRecord) msg.obj;

            r
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值