• Android学习笔记之View(二)


    View加载的流程之测量:rootView调用measure()→onMeasure();

    measure()是final方法,表明Android不想让开发者去修改measure的框架,开发者可以onMeasure方法。

    来看一下measure的代码:

    • public final void measure(int widthMeasureSpec, int heightMeasureSpec) {  
    •     if ((mPrivateFlags & FORCE_LAYOUT) == FORCE_LAYOUT ||  
    •             widthMeasureSpec != mOldWidthMeasureSpec ||  
    •             heightMeasureSpec != mOldHeightMeasureSpec) {  
    •         mPrivateFlags &= ~MEASURED_DIMENSION_SET;  
    •         if (ViewDebug.TRACE_HIERARCHY) {  
    •             ViewDebug.trace(this, ViewDebug.HierarchyTraceType.ON_MEASURE);  
    •         }  
    •         onMeasure(widthMeasureSpec, heightMeasureSpec);  
    •         if ((mPrivateFlags & MEASURED_DIMENSION_SET) != MEASURED_DIMENSION_SET) {  
    •             throw new IllegalStateException("onMeasure() did not set the"  
    •                     + " measured dimension by calling"  
    •                     + " setMeasuredDimension()");  
    •         }  
    •         mPrivateFlags |= LAYOUT_REQUIRED;  
    •     }  
    •     mOldWidthMeasureSpec = widthMeasureSpec;  
    •     mOldHeightMeasureSpec = heightMeasureSpec;  
    • }  

         

       

    一个界面的展示可能会涉及到很多次发measure,因为一个视图往往包含多个子视图,每个视图都需要经历一次measure过程。ViewGroup中定义了measureChildren()方法来测量子视图,下面是measureChildren():

       

    • protected void measureChildren(int widthMeasureSpec, int heightMeasureSpec) {  
    •     final int size = mChildrenCount;  
    •     final View[] children = mChildren;  
    •     for (int i = 0; i < size; ++i) {  
    •         final View child = children[i];  
    •         if ((child.mViewFlags & VISIBILITY_MASK) != GONE) {  
    •             measureChild(child, widthMeasureSpec, heightMeasureSpec);  
    •         }  
    •     }  
    • }  

       

    View加载的第二步: onLayout,这和measure差不多,都是由rootView调用layout()→onLayout()。

       

       

  • 相关阅读:
    intellij idea
    this.getClass().getResource(String) 路径问题
    org.hibernate.AssertionFailure: null id 错误
    Hibernate 映射
    关于idea 在创建maven 骨架较慢问题解决
    常用base.css
    form表单样式
    ul li自适应居中导航
    table-cell实现未知宽高图片,文本水平垂直居中在div
    多行文字水平垂直居中在div
  • 原文地址:https://www.cnblogs.com/yxx123/p/5227172.html
Copyright © 2020-2023  润新知