控件封装 笔记

18 阅读1分钟

declare-styleable标签和属性方法

  1. refernce:参考某一资源id; 如: @drawable/icon
  2. color:颜色值 如:#ff00ff
  3. boolean:布尔值
  4. dimension:尺寸值 如:10dp
  5. float 浮点型 如:0.7
  6. integer 整型 如:10
  7. String 字符串
  8. fraction 百分比 如:40%
  9. enum 枚举
  10. 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()

  1. getMeasureWidth()在measure()过程后可以获取宽度;getWidth()在layout过程后
  2. 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) {
    //其他代码
}