public MView(Context context) {
super(context);
}
public MView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public MView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
三个方法的区别主要
a: 代码中直接实例化自定义控件,会调用第一个构造函数
b: xml布局使用自定义控件,会调用第二个构造函数
c: xml布局使用自定义控件,并且控件含有自定义属性,仍然调用的是第二个构造函数.
d: defStyleAttr:这个参数是指,在当前view所属Activity的Theme(或如果这个Activity没有设置Theme,那么就是指Application的Theme)对控件设置的属性
e: defStyleRes:这个参数在构造方法中接收的一样是一个int类型的style,我们依然可以按照R.style.xxx的方式设置给它
通过theme设置属性的方法可见:
https://blog.csdn.net/nannan1989yue/article/details/80610013?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
自定义属性,res/values/目录下新建attrs.xml,比如
<resources>
<declare-styleable name="maicai_home_CircularCoverView">
<attr name="maicai_home_left_top_radius" format="dimension" />
<attr name="maicai_home_cover_color" format="color" />
</declare-styleable>
</resources>
format属性有11种,比如:color表示颜色,reference表示引用资源id,dimension表示尺寸,
refer:https://www.jianshu.com/p/8844de6addb3
使用时,调用如下:
TypedArray typedArray =
context.obtainStyledAttributes(attrs, R.styleable.maicai_home_CircularCoverView);
if (typedArray != null){
leftTopRadians = typedArray
.getDimensionPixelSize(R.styleable.maicai_home_CircularCoverView_maicai_home_left_top_radius, radius);
leftBottomRadians = typedArray
。。。
coverColor = typedArray.getColor(R.styleable.maicai_home_CircularCoverView_maicai_home_cover_color, coverColor);
typedArray.recycle();
}
一般情况下用前两个即可,如果需要用到主题参数,可以考虑3、4构造函数。
public TestView(Context context) {
this(context, null);
}
public TestView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public TestView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
@TargetApi(21)
public TestView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context, attrs);
}