1、整个绘制过程始于ViewRoot的performTraversals方法该方法逐级遍历视图树measurespec,每个View负责自我绘制measurespec,而ViewGroup还需通知其子View进行绘制测量过程测量过程从performMeasure方法开始MeasureSpec是核心概念measurespec,它定义measurespec了View的测量模式和尺寸DecorView的MeasureSpec由窗口尺寸和LayoutParams决定,而普通View的MeasureSpec。
2、DecorView,Activity顶级控件,一般为LinearLayout,由标题栏与内容栏构成,布局文件加入内容栏事件传递至DecorView,再继续向下理解MeasureSpec MeasureSpec为“测量规格”,由高2位的“测量模式”与低30位的“规格大小”组成,决定View尺寸SpecSize为View在父容器的大小或可用大小,SpecMode根据父容器规则。
3、Android View 的渲染流程主要包括以下三个关键步骤measure目的确定 View 的大小和尺寸核心方法onMeasure,这是自定义 View 实现的关键步骤基础单位MeasureSpec,由一个 30 位的 int 值承载,表示 View 的尺寸和规格信息包括三种模式EXACTLYAT_MOST和 UNSPECIFIEDLayoutParams对 View。
4、自定义属性可以方便配置View的属性,分为多种类型,如referencecolorbooleandimensionfloatintegerstringfractionenum和flag,以及混合类型注意,枚举类型的属性只能使用其中一个,位运算类型的属性可以使用多个值View绘制流程由measurelayoutdraw三个函数完成MeasureSpec封装View。
5、Spec为specification的缩写,以为规格或者说明书的意思英语不好,专门 用英语翻译软件翻译了一下所以顾名思义该类的所以就是定义View的测量规格或者测量规则这个类是View里面的嵌套内部类,提供了三个对外公开的static变量UNSPECIFIED,EXACTLY,AT_MOST这三个变量统称为specMode,对于一个View来说它。
6、1static int getModeint measureSpec根据提供的测量值格式提取模式上述三个模式之一2static int getSizeint measureSpec根据提供的测量值格式提取大小值这个大小也就是我们通常所说的大小3static int makeMeasureSpecint size,int mode根据提供的大小值和模式创建一个测量值格式。
7、MeasureSpec一旦确定,onMeasure就可以确定View的测量宽高小结一下 当子 View 的宽高采用 wrap_content 时,不管父容器的模式是精确模式还是最大模式,子 View 的模式总是最大模式+父容器的剩余空间View 的工作流程主要是指 measure layout draw 三大流程,即测量布局绘制其中。
8、View的测量大小发生在measure方法中,用于决定View的实际尺寸measure方法分为View和ViewGroup两种实现,其中View只测量自身大小,而ViewGroup还需测量子View的大小MeasureSpec用于封装View的测量规格,包括宽度高度和测量模式在测量过程中,MeasureSpec通过makeMeasureSpec方法生成,获取模式和尺寸信息。
9、在开发中,当Android原生控件不能满足我们的需求的时候,就需要自定义ViewView在屏幕上绘制出来先要经过measure计算和layout布局什么时候调用onMeasure方法?当子View的父控件要放置该View的时候,父控件会传递两个参数给ViewwidthMeasureSpec和heightMeasureSpec这两个参数是View可以获取的宽高。
10、29 MeasureSpec原理MeasureSpec用于描述View的尺寸需求,通过计算和比较,确保View正确显示30 自定义View的measure时机自定义View在onMeasure方法中进行尺寸计算,确保View适应不同布局需求31 LeakCanary与性能面试LeakCanary在性能面试中扮演重要角色,有助于开发者掌握内存泄漏检测与修复技能以上。
11、2因为AT_MOST对应wrap_content,EXACTLY对应match_parent,所以默认情况下,wrap_content和match_parent是具有相同的效果这里就解决了wrap_content起到了与match_parent相同的作用那么有人会问,View的MeasureSpec是怎么赋值的我们知道,View的MeasureSpec的值是根据View的布局参数LayoutParams和父容器的。
12、问题出现在View的宽 高设置,那我们直接来看自定义View绘制中第一步对View宽 高设置的过程measure过程中的 onMeasure 方法 继续往下看 getDefaultSize从上面发现那么有人会问wrap_content和match_parent具有相同的效果,为什么是填充父容器的效果呢我们知道,子View的MeasureSpec值是。
13、MeasureSpecMeasureSpec是“测量规格”,由高2位的“测量模式”和低30位的“规格大小”组成,它决定了View的尺寸SpecSize表示View在父容器中的大小或可用大小,而SpecMode则根据父容器的规则转换,从而测量出View的宽高三大流程Measure测量过程,确定View的尺寸对于单个View,通过调用measure方法。
14、测量子View的关键在于measureChildWithMargins函数,它获取宽高的measureSpec,基于这个measureSpec对view进行测量22 layout过程 基于度量值,对viewTree进行布局,流程与测量过程一致,不再赘述23 draw绘制流程 draw的入口是performTraversals,通过performDraw将绘制事件逐步传递到Viewjava中的draw函数。
15、首先,通过继承View类并重写相关方法来实现自定义View关键方法包括onMeasureonDraw和onTouchEvent在重写onMeasure方法时,通过调用父类的onMeasure方法,并解析MeasureSpec值来获取宽度或高度接着,在onDraw方法中初始化画笔,并绘制三种不同长度的刻度线刻度数字以及指示器线至此。
16、先来看看performMeasure方法的调用过程 先看performMeasure方法,这个方法有两个参数,都是通过getRootMeasureSpec方法计算得到 这里有一个关键类MeasureSpec,在这里需要了解下这个类的原理这里要感谢 这位博主 ,measurespec他讲述的很清晰,我自己动手测算了,很容易理解大概就是用一个数字通过高位记录Mode。
17、首先,onFinishInflate方法在所有子控件都映射为XML后被调用这意味着,当View的所有子元素都已加载完毕,这个方法被触发,标志着初始化阶段的结束紧接着,onMeasureint widthMeasureSpec, int heightMeasureSpec方法用于确定所有子元素的大小这是一个非常关键的步骤,因为它直接影响到View的尺寸。
上一篇: businessobjects,business objects入门
下一篇: 没有了
联系电话:18300931024
在线QQ客服:616139763
官方微信:18300931024
官方邮箱: 616139763@qq.com