1、构造方法
xml布局默认会使用两个参数的构造方法,所以要将一个和两个参数的构造指向三个参数的构造方法(this)
2、获取自定义属性
使用R.styleable.MyAttrbute_Tittle,注意此处使用_且styleable并非attr。
记得回收TypedArray.
3、引入命名空间
添加xmlns:app="http://schemas.android.com/apk/res-auto",即可使用自定义属性
4、对于自定义View宽度和高度
默认情况:Wrap_Content、Match_parent----MATCH_PARNET
指定宽度和高度----------------指定宽度高度显示
源码片段:
switch (specMode) {
case MeasureSpec.UNSPECIFIED:
result = size;
break;
case MeasureSpec.AT_MOST: ---------wrap_content
case MeasureSpec.EXACTLY:----------match_parent
result = specSize;
break;
}
对于设置了Wrap_content的时候,走的是EXACTLY(match_parent),
所以wrap_content需要自己测量,重写onMeasure()方法
5、对于onMeasure
一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。
一个MeasureSpec由大小和模式组成。
MeasureSpec的模式,三种类型:
EXACTLY:一般是设置了明确的值或者是MATCH_PARENT
AT_MOST:表示子布局限制在一个最大值内,一般为WARP_CONTENT
UNSPECIFIED:表示子布局想要多大就多大,很少使用
6、自定View步骤
1、自定义View的属性
2、在View的构造方法中获得我们自定义的属性
3、重写onMesure ]
4、重写onDraw
xml布局默认会使用两个参数的构造方法,所以要将一个和两个参数的构造指向三个参数的构造方法(this)
2、获取自定义属性
使用R.styleable.MyAttrbute_Tittle,注意此处使用_且styleable并非attr。
记得回收TypedArray.
3、引入命名空间
添加xmlns:app="http://schemas.android.com/apk/res-auto",即可使用自定义属性
4、对于自定义View宽度和高度
默认情况:Wrap_Content、Match_parent----MATCH_PARNET
指定宽度和高度----------------指定宽度高度显示
源码片段:
switch (specMode) {
case MeasureSpec.UNSPECIFIED:
result = size;
break;
case MeasureSpec.AT_MOST: ---------wrap_content
case MeasureSpec.EXACTLY:----------match_parent
result = specSize;
break;
}
对于设置了Wrap_content的时候,走的是EXACTLY(match_parent),
所以wrap_content需要自己测量,重写onMeasure()方法
5、对于onMeasure
一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。
一个MeasureSpec由大小和模式组成。
MeasureSpec的模式,三种类型:
EXACTLY:一般是设置了明确的值或者是MATCH_PARENT
AT_MOST:表示子布局限制在一个最大值内,一般为WARP_CONTENT
UNSPECIFIED:表示子布局想要多大就多大,很少使用
重写onMeasure()方法,最终要setMeasuredDimension(width, height);
1) 对于AT_MOST(wrap_content):
mHeight = Math.min(desireHeight,specHeight);
内部控件view需要的高度和父布局对子布局指定的高度的最小值
6、自定View步骤
1、自定义View的属性
2、在View的构造方法中获得我们自定义的属性
3、重写onMesure ]
4、重写onDraw
7、API相关
canvas.drawBitmap(mImage1,null,mRect,mPaint);
中的Rect.left top right bottom 代表左上角坐标以及右下角坐标