圓的自定義

提高技能從自定義View開始,從今天開始走上自定義瘋狂學(xué)習(xí)之路。首先來一波最簡單的圓的自定義。對于自定義View的原理這里不說,以后的自定義每次都會提上一點

第一步:三個構(gòu)造函數(shù)(最少需要兩個構(gòu)造方法,三個比較好點,因為兩個構(gòu)造函數(shù)的時候可能編譯的時候會有問題)

public CircleView(Context context) {
        super(context);
    }

    public CircleView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public CircleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

接著在每個構(gòu)造函數(shù)中添加一個初始化方法,用來設(shè)置圓的一些屬性,比如顏色,即下一步可如此,這里需要說明一下Paint的STyle的三種屬性,剛好發(fā)現(xiàn)網(wǎng)上有這張解析,就盜了過來
image.png
    int mColor = Color.RED;
   private Paint paint;
    public CircleView(Context context) {
        super(context);
        init();
    }

    public CircleView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CircleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        paint = new Paint();
        paint.setColor(mColor);
        paint.setAntiAlias(true);//抗鋸齒
        paint.setStyle(Paint.Style.FILL);//樣式
    }

到了這里還沒有完成,自定義的三大流程,onDraw、onMeasure、onLayout一個都沒有實現(xiàn)到。由于這個自定義圓比較簡單,我這次僅是使用了onDraw的方法將圓繪制出來,方法如下:

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int paddingLeft = getPaddingLeft();
        int paddingRight = getPaddingRight();
        int paddingTop = getPaddingTop();
        int paddingBottom = getPaddingBottom();
        int width = getWidth() - paddingLeft - paddingRight;
        int height = getHeight() - paddingTop - paddingBottom;
        int radius = Math.min(width,height)/2;
        canvas.drawCircle(paddingLeft + width/2,paddingTop + height/2,radius,paint);
    }

看到上面的方法,有沒有人注意到,方法中多了getPaddingLeft();getPaddingRight();...的方法。為什么呢?這是因為當(dāng)你僅以getWidth與getHeight方法獲取到的長寬的時候,在布局文件中想要使用padding相關(guān)的屬性是沒有辦法使用的,但是如果想上面這樣寫就不會出現(xiàn)padding無法使用的情況。
最后復(fù)制完整路徑到布局文件

<com.example.zhou.view.CircleView
        android:layout_marginTop="10dp"
        android:layout_width="match_parent"
        android:layout_height="140dp"
        />

運行,恩成功了,貼上這次自定義圓的所有代碼


public class CircleView extends View {

    int mColor = Color.RED;
    private Paint paint;


    public CircleView(Context context) {
        super(context);
        init();
    }

    public CircleView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CircleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        paint = new Paint();
        paint.setColor(mColor);
        paint.setAntiAlias(true);//抗鋸齒
        paint.setStyle(Paint.Style.FILL);
    }



    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int paddingLeft = getPaddingLeft();
        int paddingRight = getPaddingRight();
        int paddingTop = getPaddingTop();
        int paddingBottom = getPaddingBottom();
        int width = getWidth() - paddingLeft - paddingRight;
        int height = getHeight() - paddingTop - paddingBottom;
        int radius = Math.min(width,height)/2;
        canvas.drawCircle(paddingLeft + width/2,paddingTop + height/2,radius,paint);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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