自定义VIEW②绘制流程

来源:互联网 发布:泛型 java 编辑:程序博客网 时间:2024/05/20 23:03

View绘制的流程图如下:

View绘制流程图

除开类的构造之外一共有三个过程:measure过程,layout过程,以及draw过程,下面将试着解读这几个过程。


Constructor(函数的构造)

View类的构造函数有四种重载,分别如下:

public void View(Context context){...}public void View(Context context,AttributeSet attrs){...}public void View(Context context,AttributeSet attrs,int defStyleAttr){...}public void View(Context context,AttributeSet attrs,int defStyleAttr,int defStyleres){...}

通过观察源码,发现View类其实只写了两种重载:第一种以及第四种,第二,三种是通过调用第四种重载,并将其他变量设置为零。Android源码如下所示:

public View(Context context,AttributeSet attrs){    this.(Context context,AttributeSet attrs,0);}public View(Context context,AttributeSet attrs,int defStyleAttr){    this.(Context context,AttributeSet attrs,defStyleAttr,0);}

所以这里只说明一个参数以及四个参数的构造用法 :
public void View(Context context){...} : 该函数为在Activity中初始化控件所用,传递进来的context即为该空间工作的活动.

public void View(Context context,AttributeSet attrs,int defStyleAttr,int defStyleres){...} : 该函数为在XML文件中初始化控件所用,各参数作用如下:
context : 作用同上;
attrs : XML定义的属性;
defstyleattr : 默认样式属性,为view提供一个基本的样式.
defstyleres : 将资源文件中ID你故意的某个样式设置为基本样式,当且仅当defstyleattr为0时有效.

函数的构造只学习到这里,详细的以后再说.

Measure过程(测量View大小)

Measure过程的作用是负责测量View的大小,如果是ViewGroup的话,则会有序的遍历ViewGroup树,并且测量出其实际的大小,即设置时记得宽高(mMeasureHeight和mMeasureWidth属性),而宽高则是由其父视图与自身决定的.

由于课设以及时间的关系,这里不考虑测量一个ViewGroup,也就不考虑它的递归调用,仅仅考虑测量一个View对象,作为一个线性过程.

核心方法:measure() -> onMeasure() -> setMeasuredDimension().

前面的方法都是测量View的大小,而etMeasuredDimension()是该过程的终极方法,用于结束测量阶段.

Layout过程(确定子View的位置)

确定布局的函数是onLayout(),用于确定子View的位置.
在View类中onLayout()方法是空实现,而在ViewGroup类中为abstract,故如果继承自ViewGroup类的话必须重写该方法.由于我主要关注View而不是viewGroup,故暂时忽略之.

Draw过程(绘制过程)

自定义View中的重点,所有的View最终都是用draw方法进行绘制.我们应该重写onDraw(Canvas canvas) 方法以进行绘制,然后调用draw方法完成系统绘制.

对View的控制以及监听

在写View的时候暴露一些接口,以对View进行控制,或者对View进行监听.

0 0