view的工作原理

深入认识Android中View工作原理之View加载 既然分析View,咱就先从View加载这块当做入口 先来看一下LayoutInflater的基本用法吧,它的用法非常简单,首先需要获取到LayoutInflater的实例,有两种方法可以获取到,常用的如下: LayoutInflater layoutInflater = LayoutInflater.from(context); 另外一种写法: LayoutInflater layoutInflater = (LayoutInflater) context .getSystemService 阅读详情

view的工作原理

  • 基本概念

    1. ViewRoot
      对应ViewRootImpl类 是连接WindowManager和DecorView的纽带,view的三大流程均通过ViewRoot来完成,在ActivityThread中,当Activity对象呗创建完毕后,会将DectorView添加到window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DectorView对象进行关联,参照如下源码

      root = new ViewRootImpl(view.getContext(),display);
      root.setView(view,wparams,panelParentView());
      

      View的绘制流程是从view的performTraversals(译为进行遍历)方法开始的,他经过measure layout draw三个过程才能,最终将一个view绘制出来,其中measure用来测量View的宽高 layout用来确定view在父容器中的放置位置,draw则负责将view绘制在屏幕上,performTraversals会依次调用performMeasure performLayout performDraw三个方法 这三个方法分别完成顶级view的measure layout draw这三大流程

      其中在performMeasure方法中又会调用measure方法,在measure方法中又会调用onMeasure方法 在onMeasure方法中则会对所有的子元素进行measure过程,这时候measure流程就从父元素中传递到子元素中了 这样就完成了一次measure过程 接着子元素同样会重复这个过程 如此反复直到完成整个viewTree的遍历

      同理 performLayout和performDraw的传递流程也是类似的 唯一的不同是performDraw的传递过程是在draw方法中调用dispatchDraw来实现的 本质上并没有区别

      measure过程决定了view的宽高,measure完成之后, 可以通过getMeasureWidth和getMeasureHeight方法来获得view测量之后的宽高,几乎所有的情况下都是正确的,但是有例外,后边会详细说明,layout过程决定了view四个顶点的坐标和view实际的宽高,完成之后,可以通过getTop、getBottom、getLeft和getRight来拿到view四个顶点的位置,并可以通过getWidth和getHeight来拿到view最终的宽高,draw过程则决定了view的显示 只有draw方法完成之后view的内容才能呈现在屏幕上

    2. DectorView
      作为顶级view 一般情况下来说他的内部会包含一个竖直方向的LinearLayout,在这个LinearLayout中分为上下两个部分,上边是标题栏,下边是内容栏,在Activity中我们通过setContentView所设置的布局文件就是被添加到内容栏中的 由此可以解释,为什么在activity中指定布局的方法不叫setView而是叫setContentView ,我们添加的布局被添加到id为content的FrameLayout中去了,可以通过如下代码来获得content和我们所设置的布局

      ViewGrounp content = (ViewGrounp)findViewById(android.R.id.content);
      content.getChildAt(0);
      
    3. MeasureSpec
      译为测量规格,MeasureSpec代表了一个32位的int值,高2位代表SpecMode,低30位代表了SpecSize,SpecMode表示测量模式,SpecSize表示在某种测量模式之下的规格大小,MeasureSpec通过将SpecMode和SpecSize打包成一个int值来避免过多的内存占用 为了方便操作 系统提供了打包和解包方法

      • SpecMode有三个类 如下所示

        UNSPECIFIED 未指明的
            父容器不对View有任何限制 要多大给多大 一般多用于系统内部 表示一种测量状态 不需过多纠结
        
        EXACTLY 确切的
            父容器已经检测出View所需的精确大小 这个时候view的最终大小就是SpecSize所指定的值 对应于LayoutParams中的match_parent和具体数值两种模式
        
        AT_MOST 最大范围之内
            父容器指定了一个可用大小 即SpecSize view的大小不能超过这个值 对应于LayoutParams中的wrap_content
        
      • MeasureSpec和LayoutParams的对应关系

        对于等级view(DectorView)和普通view来说 MeasureSpec的转换过程略有不同,对于DectorView 其MeasureSpec,由窗口的尺寸和其自身的LayoutParams决定,对于普通view,其MeasureSpec由父容器的MeasureSpec和自身的LayoutParams来共同决定,MeasureSpec一旦确定后,onMeasure中就可以确定view的测量宽高

      • DectorView的MeasureSpec的产生遵循如下规则

        LayoutParams.MATCH_PARENT:精确模式 大小就是窗口的大小
        LayoutParams.WRAP_CONTENT:最大模式 大小不定 但是不能超过窗口的大小
        固定大小(如:100dp) 精确模式 大小为LayoutParams中指定的大小

        对于普通view来说 由于他的MeasureSpec受父容器的MeasureSpec影响 所以情况要比较复杂 源码内容也比较多,所以我们借助一个表格来表示其规则(其中parentSize是指父容器中目前可以使用的空间)

        parentSpecMode
        childLayoutParams
        EXACTLYAT_MOSTUNSPECIFIED
        dp/pxEXACTLY
        childSize
        EXACTLY
        childSize
        EXACTLY
        childSize
        match_parentEXACTLY
        parentSize
        AT_MOST
        parentSize
        UNSPECIFIED
        0
        wrap_contentAT_MOST
        parentSize
        AT_MOST
        parentSize
        UNSPECIFIED
        0

        总结一下:
        1.当view使用固定宽高的时候,不管父容器的SpecMode是什么,view的MeasureSpec都是精确模式并且其大小遵循自身的LayoutParams中的大小
        2.当view使用match_parent时,如果其父容器是精确模式,那么view也会是精确模式,并且使用父容器中可用的宽高,如果父容器是最大模式,那么view也将是最大模式,并且使用父容器中剩余的宽高
        3.当view使用wrap_content时,不管父容器是什么模式,view的MeasureSpec都是最大模式,并且其大小会使用父容器剩余可用的大小

        注:最后一个多用于系统内部 可以忽略不做过多关注

  • View的工作流程

    view的工作流程主要包括measure layout draw三大流程,即测量、布局和绘制,其中measure确定view的测量宽高,layout确定view的最终宽高和四个顶点的实际位置 ,draw则将view绘制到屏幕上

    • measure过程
      measure过程是三大流程中比较复杂的一个,要分情况来看,如果只是一个view,那么measure过程就是完成了其测量过程,如果是一个ViewGrounp,除了要完成自己的测量过程之外,还会遍历去调用所有子元素的measure方法,各个子元素再递归去执行这个流程 直到测量完成

      1. view的measure过程

        view的measure过程是尤其measure方法来完成的,measure方法是一个final方法,无法重写,在view的measure方法中又会调用view的onMeasure方法,通过阅读view的onMeasure方法可知,view的宽高由specSize决定,由此我们可以得出以下结论:

        直接继承view的自定义控件需要重写onMeasure方法,并设置wrap_content时的自身大小,否则在局中使用wrap_content就相当于使用match_parent
        

        为什么呢?如果我们在view中使用wrap_content时,那么view的specMode是AT_MOST,在这种模式之下他的宽高等于specSize,而我们在前边阅读源码的过程中,总结过一个表格,查表格可知,这种情况下,不管父容器是那种SpecMode,view的SpecSize始终都会是parentSize,也就是说,会占用父容器剩余的所有空间,这种效果和使用match_parent有什么区别呢?

        查看系统的TextView和ImageView等控件的源码可知 他们针对这种情况也做出了对应的处理 在onMeasure方法中针对wrap_content做出了特殊处理 我们在自己的控件中也可以类似的解决 如下所示

        protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec){
           super.onMeasure(widthMeasureSpec,heightMeasureSpec);
           int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
           int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
           int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
           int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
           if(widthSpecMode == MeasureSpec.AT_MOST&&heightSpecMode == MeasureSpec.AT_MOST){
                setMeasuredDimension(mWidth,mHeight);
           }else if(widthSpecMode == MeasureSpec.AT_MOST){
                setMeasuredDimension(mWith,heightSpecSize);
           }else if(heightSpecMode == MeasureSpec.AT_MOST){
                setMeasuredDimension(widthSpecSize,meight);
           }
         }
        

        在上边代码中 我们只需要给view指定一个默认的内部宽高(mWidth和mHeight)并在使用wrap_content时对view设置这个宽高即可

      2. ViewGrounp的measure过程
        对于ViewGrounp来说,除了完成自己的measure过程之外,还需要遍历子元素,调用所有子元素的measure方法,各个子元素再递归去指向这个过程,直到measure完成,和view不同的是,ViewGrounp是一个抽象类,因此他并没有重写view的onMeasure方法,而是提供了一个叫measureChildren的方法,来遍历各个子元素,调用子类的measure方法,我们直到 ViewGrounp并没有定义其测量的具体过程,因为ViewGrounp是一个抽象类,其测量过程中的onMeasure方法需要各个子类去自己实现 因为各个ViewGrounp有截然不同的特性,所以ViewGrounp没办法像view意向对onMeasure方法进行统一,只能由子类根据自身特性来去实现

      3. 如何在Activity中去获取某个view的测量宽高
        在Activity中我们无法在onCreate onStart onResume等生命周期中去获取某一个view的测量宽高,因为View的measure过程和Activity的生命周期方法并不是同步的,因此无法保证Activity执行了这些生命周期方法时某个view一定已经测量完毕了,如果view此时还没有测量完毕,那么我们所获得的宽高就是0,所以我们需要另外的方法,来获取view的measure宽高

        1. Activity/View#onWindowFocusChanged
          onWindowFocusChanged这个方法的含义是:View已经初始化完毕了,宽高已经准备好了,这时候去获取某个view的测量宽高是没有问题的,但是需要注意的是,onWindowFocusChanged方法在,Activity的窗口得到和失去焦点的时候均会被调用一次,也就是说,如果频繁的调用onPause和onResume方法的话,该方法会频繁的被调用,典型代码如下:

          public void onWindowFocusChanged(boolean hasFocus){
              super.onWindowFocusChanged(hasFocus);
                  if(hasFocus){
                     int width = view.getMeasuredWidth();
                     int height = view.getMeasuredHeight();
                  }
          }
          
        2. view.post(runnable)
          通过post可以将一个runnable投递到view消息队列的尾部 然后等待Looper调用次runnable时,view的其他任务已经完成 view已经初始化好了 典型代码如下

          protected void onStart(){
              super.onStart();
                  view.post(new Runnable(){
                      @override
                      public void run(){
                          int width = view.getMeasuredWidth();
                          int height = view.getMeasuredHeight();
                  }
              });
           }
          
        3. ViewTreeObserver
          使用ViewTreeObserver的众多回调可以完成这个功能,比如使用OnGlobalLayoutListener
          这个接口,当ViewTree的状态发生改变或者viewTree内部的View的可见性发生改变的时候
          onGlobalLayoutListener方法会被回调,因此我们可以在这个时候获取view的measure宽高
          需要注意的是,伴随着viewTree的状态改变 该方法会被回调多次 典型代码如下:

          protected void onStart(){
             super.onStart();
             ViewTreeObserver observer = view.getViewTreeObserver();
             observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
                  @suppressWarnings("deprecation")
                  @override
                  public void onGlobalLayout(){
                      view.getViewTreeObserver.removeGlobalLayoutListener(this);
                      int width = view.getMeasuredWidth();
                      int height = view.getMeasuredHeight();
                  }
             });
           }
          
        4. view.measure(int widthMeasureSpec,int hegihtMeasureSpec)
          通过手动的对view进行measure来得到view的measure宽高 这种方法比较复杂 需要分情况具体处理,根据view的LayoutParams来分 而且容易出现错误用法 不推荐使用

    • layout过程
      layout的作用是ViewGrounp用来确定子元素的位置,当viewGrounp的位置被确定之后 他在onLayout中会遍历所有的子元素,并调用子元素的layout方法,子元素确定自身位置之后,又会调用子元素的onLayout方法来确定其子元素的位置,以此类推,直到viewTree绘制完毕,layout方法确定view本身的位置 onLayout方法确定view子元素的位置

      layout方法的大致流程如下,首先会通过setFrame方法来设定view的四个顶点的位置,即初始化mLeft mTop mBottom mRight这四个值,view的四个顶点一旦被确定,view在父容器中的位置也就确定了,接着会调用onLayout方法,这个方法的用途是确定子元素的位置,在onLayout方法中,会调用setChildFrame,在该方法中又会调用子元素的layout方法,这样父元素在layout方法中确定自身的位置之后,就通过onLayout方法去调用子元素的layout方法,子元素又会通过layout来确定自己的位置,层层传递,直到ViewTree绘制完毕

    • Draw过程
      阅读源码可知 View的绘制过程遵循以下几个步骤:

      1. 绘制背景 background.draw(canvas)
      2. 绘制自身 onDraw(canvas)
      3. 绘制children dispatchDraw(canvas)
      4. 绘制装饰 onDrawScrollBars(canvas)

    View绘制过程的传递是通过dispatchDraw来实现的,dispatchDraw会遍历调用所有元素的draw方法 如此draw,事件就层层传递下去,直到绘制完毕.

  • 自定义View

    自定义View的分类

    1. 继承View重写onDraw方法
      主要用于实现一些不规则的效果,采用这种方法需要注意的就是需要自己支持wrap_content和padding,如果不定义wrap_content 在布局文件中使用该效果,回合match_parent一样(具体原因前边已做分析) 同时 view的padding属性需要在onDraw方法中去实现,否则没有效果

    2. 继承ViewGrounp派生出特殊的layout
      主要用于实现自定义布局,需要注意合适的处理viewGrounp的测量,布局过程,并且同时处理子元素的测量和布局.

    3. 继承特定的view(如TextView等)
      主要用于对某种已有的view的功能进行拓展,该方法比较容易实现,不需要自己去处理wrap_content和padding

    4. 继承特定的ViewGrounp(如LinearLayout等)
      与2类似,同时又不需要自己处理ViewGrounp的测量和绘制过程

    自定义View需要注意的问题

    1. 让View支持wrap_content
      直接继承view或者viewGrounp的控件,需要在onMeasure中对wrap_content做特殊处理

    2. 如果有必要 让自己的view支持padding
      直接继承view的控件,如果不在draw方法中处理padding,那么padding属性将失效,直接继承ViewGrounp的控件,需要在onMeasure和onLayout中考虑padding和子元素的margin对其造成的影响 不然将导致padding和子元素的margin属性失效

    3. 尽量不要在view中使用Handler
      view内部本身提供了post系列方法 完全可以替代Hnadler的作用

    4. View中如果有线程和动画需要停止 参照View#onDetachedFromWindow,当包含这个View的Activity退出或者当前view被remove时,View的onDetachedFromWindow方法会被调用,我们可以在这个回调中停止线程或者动画,与此对应的是onAttachedToWindow方法,当包含这个view的Activity启动时,View的onAttchedToWindow方法会被调用,同时,当View不可见是我们也需要停止线程和动画

    5. View带有滑动嵌套时 需要处理好滑动冲突
      具体请参见博客:view基础知识介绍(二)

参考资料:Android开发艺术探索

Android View的工作原理详解 详细讲解Android View的工作原理。分析源码,讲解View的工作流程,何时开始触发等等。 立即下载

相关推荐

View工作原理

http://blog.youkuaiyun.com/qq_26787115/article/details/53428258

View的工作原理

View的工作原理 主要内容 1.View的工作原理 2.自定义View的实现方式 3.自定义View的底层工作原理,比如View的测量流程、布局流程、绘制流程 4.View常见的回调方法,比如构造方法、onAttach.onVisibilityChanged/onDetach等 初识ViewRootImpl 和DecorView ViewRootImpl类是连接...

追梦天涯33的博客 398

WSL2双显卡配置实战:避开Tesla与TCC模式的那些坑

本文针对WSL2环境下无法识别Tesla计算卡的问题进行深度解析。核心原因在于WSL2目前仅支持WDDM模式的显卡,而Tesla系列及运行在TCC模式下的显卡因采用纯计算架构而无法兼容。文章提供了详细的排查步骤,并给出了包括调整显卡用途、使用虚拟机或物理机在内的多种实用解决方案,帮助开发者避开配置陷阱。

weixin_29289821的博客 538

第四章:View的工作原理

Android开发艺术探索第四章

weixin_73891206的博客 1992

tft_espi 中文字体及自定义字体制作(tft.eSPI模块)

tft.eSPI库自定义字体方法 先下载 processing 然后安装到mixly安装目录下找到tft_eSPI文件夹。

琢磨侠的博客 2762

802.1AS-2011_Gptp协议栈

GPTP(广义时钟同步协议,或IEEE 802.1AS)的基本功能是确保局域网中所有的时钟都同步,并提供时间信息。这种协议用于在局域网中进行同步和时间对齐,其目的是确保网络中各设备的时间一致性。

weixin_49041703的博客 2541

深入解析Android中View的工作原理

当子元素测量完毕后,LinearLayout会测量自身的大小,对于竖直的LinearLayout,它在水平方向上的测量过程,遵循View的测量过程,在竖直方向上,如果采用的是match_parent或者具体的数值,那么它的测量过程和View的一致,即高度为specSize;1.MeasureSpec很大程度上决定一个View的尺寸规格,测量过程中,系统会将View的layoutParams根据父容器所施加的规则转换成对应的MeasureSpec,再根据这个measureSpec来测量出View的宽/高。

Android_XG的博客 2191

31、双相不锈钢直齿轮加工与性能研究及人工神经网络在焊接中的应用

本文研究了双相不锈钢直齿轮在不同加工方法(WEDM与滚齿加工)下的磨损行为,分析了表面粗糙度、齿厚变化、磨损率及润滑性能随转速的变化规律,并对比了两种工艺的优劣。同时,探讨了人工神经网络(ANN)在AA7050铝合金搅拌摩擦焊中的应用,通过建立工艺参数与焊接质量之间的预测模型,实现了对焊缝硬度和峰值温度的准确预测。研究为高性能齿轮制造和铝合金焊接提供了理论支持和技术参考,并提出了未来在润滑优化、加工工艺改进及智能控制方面的研究方向。

ggg99的专栏 150

Android View工作原理

前言 在Android知识体系中,View扮演了很重要的角色;它是Android在视觉上的呈现,Android本身提供了一套GUI库,但是我们的需求不止于系统自带的GUI,因此我们还需要自定义View。而自定义View过程中我们势必要对View的底层工作原理有所了解。这篇文章就记录一下View的测量、布局、绘制三大流程。 1.一些必要的基本概念 1.1 ViewRoot和DecorView Vie...

qq_34341338的博客 298

全局–局部傅里叶神经算子(GL-FNO):原理、严格推导与 PINN 混合策略

本文提出了一种全局-局部傅里叶神经算子(GL-FNO)及其与物理信息神经网络(PINN)的结合方法。主要内容包括: 架构设计:GL-FNO包含两个分支 - 全局分支处理低频结构,使用下采样输入;局部分支处理高频细节,使用全分辨率输入。两分支通过自适应门控机制融合。 理论分析:证明了GL-FNO在"低频全局+高频局部"任务上的优势,给出了误差分解和复杂度分析,并推导了与PINN结合时的渐进一致性条件。 实现方法:采用频谱微分计算物理残差,推导了完整的训练流程,包括数据损失与物理损失的联合优

VectorShift的博客 1330

芒果YOLOv5改进05:损失函数IoU 篇之Repulsion Loss:原创改进损失函数 Repulsion:解决目标遮挡场景下检测,为解决密集人群检测中遮挡设计的损失函数,打造高效检测器涨点

YOLOv5改进代码实践|结合Repulsion 解决目标遮挡场景下检测🚀

包括YOLOv5、YOLOv7、YOLOv8等模型改进 4564

【Android】View工作原理

View是Android在视觉上的呈现在界面上Android提供了一套GUI库,里面有很多控件,但是很多时候我们并不满足于系统提供的控件,因为这样就意味这应用界面的同类化比较严重。那么怎么才能做出与众不同的效果呢?答案是自定义View,也可以叫自定义控件,通过自定义View我们可以实现各种五花八门的效果。除了View的三大流程以外,View常见的回调方法也是需要熟练掌握的,比如构造方法、onAttach、onViVisibilityChanged、onDetach等。

2301_79977698的博客 1431

CMake教程:C++ CMake自定义find_package并在其它项目使用

find_package 是 CMake 中一个非常重要的命令,用于在系统中找到外部库或包,并将其包含到项目中。: 要查找的包的名称。[version]: 可选的版本号。如果指定了版本号,CMake 会尝试找到该版本或更高版本的包。[REQUIRED]: 如果指定了这个关键字,找不到包时会产生一个错误并终止配置过程。: 指定要查找的包的组件。: 指定可选的组件,即使找不到这些组件,配置过程也会继续。: 指定查找包的模式,CONFIG表示查找配置文件,MODULE表示查找模块文件。

琅嬛福地 1561

View的工作原理小结

View的工作原理 一、初识ViewRoot和DecorView ViewRoot对应于ViewRootImpl类,为连接WindowManager和DecorView的纽带。首先看看ViewRootImpl是什么时候被调用的。 1、启动Acitivity 最终会调用 ActivityThread#handleResumeActivity(),这里面会执行窗体添加 DecorView 的操作 ( ...

湟同学你好的博客 1861

瑞数jsvmp算法还原流程讲解

​ 又是很久没写文章了,今天水一篇文章吧,鉴于之前有看到过别人的文章被警告的案例,所以这篇文章就仅写一下还原瑞数vmp的大概流程吧(仅记录下自己还原的思路)

博客 6606

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

06. View工作原理

扁平化视图层级:每个视图层级都会增加measure和layout的复杂度。扁平化视图层级可以减少measure和layout的调用自定义 ViewGroup 优化布局逻辑:默认的ViewGroup测量逻辑会遍历所有子视图,可能造成性能浪费。我们可以 通过自定义ViewGroup的测量逻辑来优化性能避免在onDraw中分配对象:这会导致频繁的内存分配和垃圾回收(GC)。优化invalidate:调用会触发onDraw,过于频繁的调用会增加 CPU 和 GPU 的负担。避免不必要的调用。

qq_35829566的博客 1402

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android view工作原理,重温Android开发艺术探索之四 View工作原理

View 的工作原理ViewRoot 和DecorViewViewRoot对应ViewRootImpl,是连接WindowManager 和DecorView的纽带。View的三大流程都是通过ViewRoot完成的,如图所示,![ViewRootImpl 的代码结构图]并且当系统一些常量发生改变时也是有它监听到了处理的在ActivityThread的attach方法中有添加这个监听,源码如下Vie...

weixin_35135480的博客 145

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android View 工作原理基础

View 工作原理基础 本章主要介绍View的工作原理,了解了工作原理后才能作出比较完善的自定义View,View需要掌握三大流程:measure、layout和draw,除了三大流程以外,还需要掌握常见的回调方法,比如构造方法、onAttach、onVisibilityChanged、onDetach等。 初识ViewRoot和DecorView 了解ViewRoot和DecorView的概念有...

提辖鲁的博客 379

揭开Android View的神秘面纱:深入探索工作原理

在 Android 开发中,自定义 View 是实现个性化界面和独特交互效果的重要手段。根据不同的需求和场景,自定义 View 主要分为以下几种常见类型,每种类型都有其独特的实现要点和挑战。继承 View 类是最基础的自定义 View 方式,适用于需要实现完全自定义的绘制效果,无法通过现有控件组合来实现的场景。在这种方式下,开发者需要重写 onDraw 方法,使用 Canvas 和 Paint 来绘制各种图形、文本和图像,以实现所需的视觉效果。

顾林海 3125

Android View 工作原理分析

View的工作原理分析 View的工作流程主要是指measure、layout、draw这三大流程,即测量、布局和绘制,其中measure确定View的测量宽/高,layout确定View的最终宽/高和四个顶点的位置,而draw则将View绘制到屏幕上。 measure过程 measure过程分两种,第一种是view,只需通过measure方法就可以完成测量过程。还有一种是ViewGroup,除了...

提辖鲁的博客 297
上一篇: view基础知识介绍(二)
下一篇: ProGuard模板
gitzzp
博客等级 码龄11年 307粉丝 60原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值