剖析API Demos中的LabelView
对于谷歌给我们提供的ApiDemo里有很多有学习参考价值的实例,今天来学习理解其中的一个实例类LabelView,此类
继承View,并对View中的onMeasure(),Ondraw()方法进行了重写,其中涉及到setMeasuredDimension() , MeasureSpec,Canvas,Paint,以及自定义
属性的一些应用。
像完全自定义控件(也就是继承View自定义控件),一般会想到覆盖onMeasure(),Ondraw(),
默认onMeasure()会总是设置一个100*100尺寸
关于自定义属性 可以参考 Android开发之自定义属性(Define Custom Attributes)
下面是主要实现代码
public static class MeasureSpec { private static final int MODE_SHIFT = 30; private static final int MODE_MASK = 0x3 << MODE_SHIFT; public static final int UNSPECIFIED = 0 << MODE_SHIFT; public static final int EXACTLY = 1 << MODE_SHIFT; public static final int AT_MOST = 2 << MODE_SHIFT; public static int makeMeasureSpec(int size, int mode) { return size + mode; } public static int getMode(int measureSpec) { return (measureSpec & MODE_MASK); } public static int getSize(int measureSpec) { return (measureSpec & ~MODE_MASK); } }
onMeasure(int widthMeasureSpec, int heightMeasureSpec) 方法, 系统在绘制对象时,首先得确定对象在屏幕上占用多大的范围,因此在这个方法中,必须得确定好控件的尺寸然后通过一个特定的函数接口(setMeasuredDimension(width, height))去通知系统有关该控件的尺寸信息。系统传递进来的两个参数是一个约束条件,控件到底占据多大的尺寸由这两个参数决定, 每一个参数其实一个MeasureSpec对象,该对象包含了Measure's Mode和Size两个属性:
Mode
UNSPECIFIED 系统对对象的size没进行约束,可以任意设置
EXACTLY 系统对对象的size已经确定,只能为MeasureSpec对象中指定的size
AT_MOST 系统对对象的最大size进行了约束,即该对象的size不能超过MeasureSpec对象中指定的size
参考资料
android中onMeasure初看,深入理解布局之一!
http://zhidao.baidu.com/question/525618489.html
Custom Components
点击下载源码