declare-styleable标签和属性方法
- refernce:参考某一资源id; 如: @drawable/icon
- color:颜色值 如:#ff00ff
- boolean:布尔值
- dimension:尺寸值 如:10dp
- float 浮点型 如:0.7
- integer 整型 如:10
- String 字符串
- fraction 百分比 如:40%
- enum 枚举
- flag 位或运算
属性定义可以指定多种类型,用|分隔
导入自定义的属性集:
1.在根布局上添加xmlns:(自定义名称) ="schemas.android.com/apk/res/(项目…"
2.在根布局上添加xmlns:(自定义名称)="schemas.android.com/apk/res-aut…
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec){}
//xml对应关系:
WRAP_CONTENT -> AT_MOST
match_parent -> EXACTY
具体值 -> EXACTY
如果是EXACTY 直接使用,AT_MMOST 需要根据情况计算
别忘了最后使用setMeasuredDimension() 否则不生效
在获取子view宽高时要先调用measureChild,不然获取不到
getMeasureWidth()和getWidth()
- getMeasureWidth()在measure()过程后可以获取宽度;getWidth()在layout过程后
- getMeasrueWidth()中的值通过setMeasureDimension()函数进行设置。getWidth()通过layout(left,top,right,bottom)来设置
//一般情况下这两个值是一样的,但是如果在layout()传入宽度值和getMeasureWidth()函数返回的不一样,那两个值就不一样
获取子控件margin值
如果要自定义ViewGroup支持子控件的layout_margin参数,则自定义ViewGroup必须重写generateLayoutParams(),并在该函数中返回一个ViewGroup.MarginlayoutParams派生类对象。
@Override protected LayoutParams generateLayoutParams(LayoutParams p) {
return new MarginLayoutParams(p);
}
@Override public LayoutParams generateLayoutParams(AttributeSet attrs) {
return new MarginLayoutParams(getContext(), attrs);
}
@Override protected LayoutParams generateDefaultLayoutParams() {
return new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
}
//默认的generateLayoutParams只会提取宽高值
//为了稳妥我们可以重写
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
return super.generateLayoutParams(attrs);
}
//或者在onMeasrue或onLayout方法中,判断
if(pamarm instanceof MarginlayoutPamars) {
//其他代码
}