Android群英传——第三章绘制View和ViewGroup

Android在绘制View之前,需要知道这个View的大小,即需要对View进行测量。这个过程在onMeasure方法中进行
Android提供了一个MeasureSpec类用来帮助我们测来嗯View
- MeasureSpec是一个32位int值
- 高2位为测量模式,低30位为测量大小
- 测量模式:
- EXACTLY:精确值模式,比如width指定为match_parent或100dp
- AT_MOST:最大值模式,比如wrap_content
- UNSPECIFIED:不指定测量大小
- View的默认onMeasure()方法只支持EXACTLY模式,如果要使用其他模式需要重写onMeasure()方法
- 如果想让View支持wrap_content,则必须要根据情况设置view的大小

测量View:

  1. 在onMeasure()方法中测量
  2. 使用setMeasuredDimension()方法设置测量后的值
  3. 默认的wrap_content(AT_MOST),会填充父布局
  4. 使用MeasureSpec进行设置或者获取View的模式和大小
  @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(mesure(widthMeasureSpec), mesure(heightMeasureSpec));
    }

private int mesure(int measureSpec) {
        int result = 0;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        if (specMode == MeasureSpec.EXACTLY) {  // 当设置为match_parent时,控件的大小设置多少就是多少
            result = specSize;
        } else {  // 当没有精确的值的时候,设置为200
            result = 200;
            if (specMode == MeasureSpec.AT_MOST) { // 当为wrap_content的时候,默认会填充整个屏幕
                result = Math.min(result, specSize);  // 如果手机的宽度或者高度小于200,
                // 则使用手机宽度高度作为view的width和height
            }
        }
        return result;
    }

绘制View

在onDraw()中使用Canvas绘画

创建Canvas

在外部创建Canvas时,通常使用 Canvas(Bitmap)构造器,这是因为传入的这个bitmap与Canvas紧密联系,称之为装载画布。
Bitmap将会用来存储所有绘制在Canves上的像素信息。
当使用此构造器后,后面所有的draw方法都会发生在bitmap上(可以理解Canvas实际上为在bitmap上作画)

ViewGroup测量

ViewGroup主要用于管理子View:管理子View的大小,子View的位置
当ViewGroup为wrap_content的时候,就需要对子View进行遍历,从而确定自己的大小
在onMeasure()方法测量结束后,使用onLayout()确定每个子View的位置

ViewGroup的绘制

ViewGroup会使用dispatchDraw()方法绘制子View

具体请参考:Android视图绘制流程完全解析,带你一步步深入了解View(二)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值