提高技能從自定義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);
}
}