分类: Android平台
2014-11-27 17:44:31
每一个视图的绘制过程都必须经历三个最主要的阶段,即onMeasure()、onLayout()和onDraw()。
1. onMeasure()方法用于测量视图的大小。
View系统的绘制流程会从ViewRoot的performTraversals()方法中开始,在其内部调用View的measure()方法。measure()方法接收两个参数,widthMeasureSpec和heightMeasureSpec,这两个值分别用于确定视图的宽度和高度的规格和大小。MeasureSpec的值由specSize和specMode共同组成的,其中specSize记录的是大小,specMode记录的是规格。通常情况下,这两个值都是由父视图经过计算后传递给子视图的,说明父视图会在一定程度上决定子视图的大小。如果你不想使用系统默认的测量方式,可以按照自己的意愿重写onMeasure()方法。
2. onLayout()方法用于给视图进行布局,确定视图的位置。
ViewRoot的performTraversals()方法会在measure结束后继续执行,并调用View的layout()方法来执行此过程。ViewGroup中的onLayout()方法是一个抽象方法,这就意味着所有ViewGroup的子类都必须重写这个方法。如:LinearLayout、RelativeLayout等布局,都是重写了这个方法,然后在内部按照各自的规则对子视图进行布局的。
3. onDraw()方法对视图进行绘制。
重写onDraw()方法,并且在里面执行绘制逻辑。绘制的方式主要是借助Canvas这个类,它会作为参数传入到onDraw()方法中,供给每个视图使用。
按类型划分,自定义View的实现方式大概可以分为三种:自绘控件、组合控件、以及继承控件。注意,自定义的View在使用的时候一定要写出完整的包名,不然系统将无法找到这个View。
1. 自绘控件
View上所展现的内容全部都是我们自己绘制出来的。绘制的代码是写在onDraw()方法中。
2. 组合控件
不需要自己去绘制视图上显示的内容,而只是用系统原生的控件,将几个系统原生的控件组合到一起,这样创建出的控件就被称为组合控件。
3. 继承控件
我们不需要自己重头去实现一个控件,只需要去继承一个现有的控件,然后在这个控件上增加一些新的功能,就可以形成一个自定义的控件。