Android_(自定义view_2)

来源:互联网 发布:国内室内滑雪场 知乎 编辑:程序博客网 时间:2024/06/05 03:10

笔记是个人学习整理。
View绘制过程
View的绘制可以分为下面三个过程:
1:Measure

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {}

View类已经提供了一个基本的onMeasure实现:

   public static int getDefaultSize(int size, int measureSpec) {        int result = size;        int specMode = MeasureSpec.getMode(measureSpec);        int specSize = MeasureSpec.getSize(measureSpec);        switch (specMode) {        case MeasureSpec.UNSPECIFIED:            result = size;            break;        case MeasureSpec.AT_MOST:        case MeasureSpec.EXACTLY:            result = specSize;            break;        }        return result;    }

MeasureSpec类是View类的一个内部静态类,它定义了三个常量UNSPECIFIED、AT_MOST、EXACTLY,其实我们可以这样理解它,它们分别对应LayoutParams中match_parent、wrap_content、xxxdp。我们可以重写onMeasure来重新定义View的宽高
2:Layout
Layout过程对于View类非常简单,同样View给我们暴露了onLayout方法

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {}

3:Draw
Draw过程,就是在canvas上画出我们需要的View样式。同样View给我们暴露了onDraw方法

protected void onDraw(Canvas canvas) {}

View中还有三个比较重要的方法
requestLayout
View重新调用一次layout过程。

invalidate
View重新调用一次draw过程

forceLayout
标识View在下一次重绘,需要重新调用layout过程。

测试:public class DemoView extends View {  public DemoView(Context context) {    this(context,null);  }  public DemoView(Context context, AttributeSet attrs) {    this(context, attrs, 0);  }  public DemoView(Context context, AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);  .......}

View有了三个构造方法需要我们重写,这里介绍下三个方法会被调用的场景,

第一个方法,一般我们这样使用时会被调用,View view = new View(context);
第二个方法,当我们在xml布局文件中使用View时,会在inflate布局时被调用,

第三个方法,跟第二种类似,但是增加style属性设置,这时inflater布局时会调用第三个构造方法。

0 0
原创粉丝点击