读书人

辨析API Demos中的LabelView

发布时间: 2013-04-09 16:45:09 作者: rapoo

剖析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

点击下载源码


读书人网 >操作系统

热点推荐