Android控件架构(20170427)

1.UI界面架构

每个Activity都包含一个Window对象,通常由PhoneWindow来实现,将一个DecorView设置为整个应用窗口的根View,这里面所有View的监听事件,都通过WindowManagerService来进行接收,然后通过Activity对象来回调对应的onClickListener。在展示上,DecorView将屏幕分为上下两部分,一个是TitleView,另一个是ContentView。其中ContentView是一个ID为content的Framelayout,通常我们编写的界面就是这部分。

注:
1.通过设置requestWindowFeature(Window.FEATURE_NO_TITLE)来设置全屏显示,视图树中的布局就只有Content了,这个调用要在setContentView()方法之前才能生效。
2.在代码中,程序在onCreate()方法中调用setContentView()方法后,ActivityManagerService会回调onResume()方法,此时系统才会把整个DecorView添加到PhoneWindow中,并让其显示出来, 从而最终完成界面的绘制。

2.View的测量

view的测量在onMeasure()方法中进行,通过MeasureSpec类,它是一个32位的int值,其中高2位为测量的模式,低30位为测量的大小。
测量的模式分为三种:
EXACTLY,即精确值模式,当我们将控件的宽高指定为具体数值或者match_parent时,系统使用的为该模式。

AT_MOST,即最大值模式,当控件的宽高为wrap_content时,此时控件的尺寸只要不超过父控件允许的最大尺寸即可。

UNSPECIFIED,不指定其大小测量模式,view想多大就多大,通常情况下在绘制自定义view时才会使用。

注:view类默认的onMeasure()只支持EXACTLY模式,如需让自定义控件支持wrap_content属性,就必须重写onMeasure()

重写onMeasure时,查看super.onMeasure()方法中,系统最终会调用setMeasuredDimension(int measuredWidth, int measuredHeight)方法将测量后的宽高值设置进去。

代码如下:

// 重写onMeasure
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
}

// 测量宽度(高度相同)
private int measureWidth(int measureSpec) {
    int result = 0;
    // 从MeasureSpec对象中提取具体的测量模式和大小
    int specMode = MeasureSpec.getMode(measureSpec); // 模式
    int specSize = MeasureSpec.getSize(measureSpec); // 大小

    if(specMode == MeasureSpec.EXACTLY) {
        // 该模式下直接为指定的specSize
        result = specSize;
    } else {
        // 另两种模式需要给一个默认大小
        result = 200;
        if(specMode == MeasureSpec.AT_MOST) {
            // 该模式下取默认和指定值的最小值
            result = Math.min(result,specSize);
        }
    }
    return result;
}

3.View的绘制

重写onDraw(),通过其中的canvas对象进行绘制。
装载画布:

Canvas canvas = new Canvas(bitmap)

在onDraw中可通过如下方式绘制:

canvas.drawBitmap(bitmap1, 0, 0, null);
Canvas mCanvas = new Canvas(bitmap1);
mCanvas.drawXXX

重点需要学习Canvas、Paint、Path的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值