自定義屬性
像android:layout_width和android:padding這種以android開頭的屬性是系統自帶的,還可以添加自定義屬性。
-
在res/values文件夾下建立xml,如attrs.xml(命名隨意)。
在View的構造方法中解析自定義屬性的值并做相應處理。
public CircleView(Context context) {
super(context);
init();
}
public CircleView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public CircleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// 加載自定義屬性集合CircleView,接著解析CircleView屬性集合中的circle_color屬性,它的id是R.styleable.CircleView_circle_color
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleView);
mColor = typedArray.getColor(R.styleable.CircleView_circle_color, Color.GRAY);
// 釋放資源
typedArray.recycle();
init();
}
3.在布局文件中使用自定義屬性。為使用,必須在布局文件中添加schemas聲明(命名空間)
xmlns:app="http://schemas.android.com/apk/res-auto"
<com.example.jkdemo.CircleView
android:id="@+id/circleView"
android:layout_width="100dp"
android:layout_height="100dp"
android:text="啊啊啊"
android:gravity="center"
android:layout_gravity="center"
app:circle_color="@color/colorAccent"
/>
除此之外
如果是直接繼承View或者ViewGroup實現的話,需要在onMeasure中對wrap_content做特殊處理,否則在布局中使用wrap_content時就無法達到預期效果。
如果可以,支持padding,如果不在draw方法里處理padding,那么padding屬性是不起作用的。處理很簡單,就是在繪制的時候考慮到View四周的空白,即在使用或者獲取寬高的時候減掉上下左右相應padding值就可以了。
范例
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CircleView">
<attr name="circle_color" format="color"/>
</declare-styleable>
</resources>
public class CircleView extends TextView {
private Paint mPaint;
private int mColor;
public CircleView(Context context) {
super(context);
init();
}
public CircleView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public CircleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleView);
mColor = typedArray.getColor(R.styleable.CircleView_circle_color, Color.GRAY);
typedArray.recycle();
init();
}
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(mColor);
}
@Override
protected void onDraw(Canvas canvas) {
int width = getWidth();
int height = getHeight();
int radius = Math.min(width, height) / 2;
canvas.drawCircle(width / 2, height / 2, radius, mPaint);
super.onDraw(canvas);
}
}
<com.example.jkdemo.CircleView
android:id="@+id/circleView"
android:layout_width="100dp"
android:layout_height="100dp"
android:text="啊啊啊"
android:gravity="center"
android:layout_gravity="center"
app:circle_color="@color/colorAccent"
/>