自定義View范例

自定義屬性

像android:layout_width和android:padding這種以android開頭的屬性是系統(tǒng)自帶的,還可以添加自定義屬性。

  1. 在res/values文件夾下建立xml,如attrs.xml(命名隨意)。


  2. 在View的構(gòu)造方法中解析自定義屬性的值并做相應(yīng)處理。


    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"
        />

除此之外

  1. 如果是直接繼承View或者ViewGroup實現(xiàn)的話,需要在onMeasure中對wrap_content做特殊處理,否則在布局中使用wrap_content時就無法達到預(yù)期效果。

  2. 如果可以,支持padding,如果不在draw方法里處理padding,那么padding屬性是不起作用的。處理很簡單,就是在繪制的時候考慮到View四周的空白,即在使用或者獲取寬高的時候減掉上下左右相應(yīng)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"
        />
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容