[Android高级进阶] - Android View绘制流程

来源:互联网 发布:手机淘宝怎么换主题 编辑:程序博客网 时间:2024/06/05 18:58

主要本文的主要的内容来源《Android 高级进阶》(顾浩鑫/著)图书


  说到android View(包括ViewGroup)的绘制流程,可以模拟一个生活中的场景。就好比, 一个演员要去人民大会堂演出。进入人民大会堂的时候,门口的保安叔叔要开始搜身(相当于调用onMeasure函数),这里主要给你量一量身高,三围,体重什么的。然后,做好记录你属于哪一种人(Measure.UNSPECIFIED 或者 Measure.EXACTLY 或者 Measure.AT_MOST)。同时,在此你也可以把自己设置成(setMeasuredDimension)他们想要的。

   等进入会场以后, 就要找到自己合适的位置(onLayout),根据号码牌(参数)进行入座等待上台表演节目。

   时间到了,开始上台的表演了(onDraw)。


  Android View 绘制分为三个流程:测量(Measure),  布局(Layout),绘制(Draw)

  测量,就是测量的在父视图中测试所占据的位置大小。(在Activity中onResume函数后执行)MeasureSpec类,作为测量静态类。提供了种测量的模式:

1, UNSPECIFIED 不指定测量模式, 通常用在的系统内部,应用中很少用到。

2, EXACTLY 精确测量模式, 当layout_width,  layout_height 的值是一个精确的值或者 match_parent时

3, AT_MOST 最大值模式,  当layout_width,  layout_height 的值是wrap_parent时,此时子视图的尺寸可以是不超过父视图的任何尺寸。

  在View中可以重写onMeasure进行自身在父视图中所占位置的调整,可以调用setMeasuredDimension函数进行改变大小。

@Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int mode = MeasureSpec.getMode(widthMeasureSpec);        int widthSize = MeasureSpec.getSize(widthMeasureSpec);        Log.i(getClass().getSimpleName(), "widthMeasureSpec mode >> " + this.toModeString(mode) + ", 宽度:" + widthSize);        mode = MeasureSpec.getMode(heightMeasureSpec);        int heightSize = MeasureSpec.getSize(heightMeasureSpec);        Log.i(getClass().getSimpleName(), "heightMeasureSpec mode >> " + this.toModeString(mode) + ", 高度:" + heightSize);        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        // 改变视图的尺寸        super.setMeasuredDimension(200,200);    }

 布局, 就是确定View在父视图中的位置。

 绘制,分为6个步骤:

1, 绘制View的背景

2,如果需要的话,保存canvas的图层,为fading做准备

3,绘制View 内容

4,绘制View的子View

5,如果需要的话,绘制View的fading边缘并恢复图层

6,绘制View的装饰(例如:滚动条


0 0
原创粉丝点击