每次在GitHub上看到一些酷炫的控件,心中就会忍不住惊叹,也会发出呐喊,有一天我也要写出这么酷炫的控件。为了当艺术家,必然要学习自定义View。
View的绘制流程是从ViewRoot的performTraversals方法开始的,它经过measure、layout和draw三个过程才能最终将一个View绘制出来,其中measure用来测量View的宽和高,layout用来确定View在父容器中的放置位置,而draw则负责将View绘制在屏幕上。
MeasureSpec通过将SpecMode和SpecSize打包成一个int值来避免过多的对象内存分配,为了方便操作,其提供了打包和解包的方法。SpecMode有三类
- UNSPECIFIED(不指定模式)
值为 1073741824
想多大多大,一般用于系统内部 - EXACTLY(精确模式)
父View告诉你,你应该多少大小.当XMl里的宽高属性为具体值或者为match_parent,为EXACTLY. - AT_MOST(至多模式)
AT_MOST值为:-2147483648
子控件大小最多为多少,在xml里配置的属性为wrap_content的时候.如果自定义View要支持wrap_content必须重写onMeasure,否则大小可能为0
接下去会发表自定义View的实战代码,终有一天成为艺术家写出酷炫的View.