自定义View构造方法
例子:自定义TextView
- 构造函数会在代码里面new的时候调用
//TextView tv = new TextView(this);
public TextView(Context context){
super(context);
}
- 在布局layout中使用时调用
public TextView(Context context,AttributeSet attrs){
super(context,attrs);
}
- 在布局layout中使用时,自定义样式style
public TextView(Context context,AttributeSet attrs,int defStyleAttr{
super(context,attrs,defStyleAttr);
}
onMeasure()
自定义View的测量方法 布局的宽高由这个方法指定
获取宽高的模式
int widthMode = MeasureSpec.getMode(widthMeasure)
int heightMode =MeasureSpec.getMode(heightMeasure)
MeasureSpec.AT_MOST
在布局中指定wrap_contentMeasureSpec.EXACTLY
在布局中指定具体的值MeasureSpec.UNSPECIFIED
尽可能的大
onDraw() 用于绘制
onTouchEvent() 用于事件处理 要return true才有完整的事件分发流程(责任链模式)
自定义属性
- 自定义属性是用来配置的,在attrs.xml中去配置相应的属性
//格式:string 文字 color 颜色 dimension 宽高
//字体大小 integer refercence 资源(drawable)
<attr name="text" format="string"/>
<attr name="background" format="reference|color"/>
//枚举
<attr name="inputType">
<enum name="number" value="1"/>
<enum name="text" value="2"/>
<attr/>
- 在布局中使用 记得声明命名空间
- 在代码中获取自定义属性
//xxx为在style里面定义的自定义属性
TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.xxx);
int Color = array.getColor(R.styleable.xxx,Color);
int mTextSize = array.getDimensionPixelSize(R.styleable.xxxx_textSize,mTextSize)
//记得回收♻️
array.recycle();