Android-6步教你自定義View

如果你打算完全定制一個(gè)View,那么你需要實(shí)現(xiàn)View類(所有的Android View都實(shí)現(xiàn)于這個(gè)類),并且實(shí)現(xiàn)確定尺寸的onMeasure(…))方法和確認(rèn)繪圖的onDraw(…))方法。

學(xué)習(xí)Android的同學(xué)注意了!??!

學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話,歡迎加入Android學(xué)習(xí)交流群,群號(hào)碼:364595326? 我們一起學(xué)Android!

如果你打算完全定制一個(gè)View,那么你需要實(shí)現(xiàn)View類(所有的Android View都實(shí)現(xiàn)于這個(gè)類),并且實(shí)現(xiàn)確定尺寸的onMeasure(…))方法和確認(rèn)繪圖的onDraw(…))方法。

自定義View一共分為6步

第一步

publicclass?SmileyView?extendsView{

private?Paint?mCirclePaint;

private?Paint?mEyeAndMouthPaint;

privatefloatmCenterX;

privatefloatmCenterY;

privatefloatmRadius;

private?RectF?mArcBounds?=?new?RectF();

publicSmileyView(Context?context)?{

this(context,null);

}

publicSmileyView(Context?context,?AttributeSet?attrs)?{

this(context,?attrs,?0);

}

publicSmileyView(Context?context,?AttributeSet?attrs,intdefStyleAttr)?{


super(context,?attrs,?defStyleAttr);

initPaints();

}

private?void?initPaints()?{/*?...?*/}

@Override

protected?void?onMeasure(intwidthMeasureSpec,intheightMeasureSpec)?{/*?...?*/}

@Override

protected?void?onDraw(Canvas?canvas)?{/*?...?*/}

}

2.實(shí)現(xiàn)畫筆paint類

本文一共兩只畫筆

private?void?initPaints()?{

mCirclePaint?=?new?Paint(Paint.ANTI_ALIAS_FLAG);

mCirclePaint.setStyle(Paint.Style.FILL);

mCirclePaint.setColor(Color.YELLOW);

mEyeAndMouthPaint?=?new?Paint(Paint.ANTI_ALIAS_FLAG);

mEyeAndMouthPaint.setStyle(Paint.Style.STROKE);

mEyeAndMouthPaint.setStrokeWidth(16?*?getResources().getDisplayMetrics().density);

mEyeAndMouthPaint.setStrokeCap(Paint.Cap.ROUND);

mEyeAndMouthPaint.setColor(Color.BLACK);

}

3.覆寫onMeasure(…)方法

實(shí)現(xiàn)這個(gè)方法告訴了母容器如何放棄自定義View,可以通過提供的measureSpecs來決定你的View的高和寬,以下是一個(gè)正方形,確認(rèn)它的寬和高是一樣的。

@Override

protected?void?onMeasure(intwidthMeasureSpec,intheightMeasureSpec)?{

intw?=?MeasureSpec.getSize(widthMeasureSpec);

inth?=?MeasureSpec.getSize(heightMeasureSpec);

intsize=?Math.min(w,?h);

setMeasuredDimension(size,size);

}

注意:

這個(gè)方法需要至少保證一個(gè)setMeasuredDimension(..)調(diào)用,否則會(huì)報(bào)IllegalStateException錯(cuò)誤。

4.實(shí)現(xiàn)onSizeChanged(…)方法

這個(gè)方法是你獲取View現(xiàn)在的寬和高. 這里我們計(jì)算的是中心和半徑。

@Override

protected?void?onSizeChanged(intw,inth,intoldw,intoldh)?{

mCenterX?=?w?/?2f;

mCenterY?=?h?/?2f;

mRadius?=?Math.min(w,?h)?/?2f;

}

5.實(shí)現(xiàn)onDraw(…)方法

這個(gè)方法提供了如何繪制view,它提供的Canvas類可以進(jìn)行繪制。

@Override

protected?void?onDraw(Canvas?canvas)?{

//?draw?face

canvas.drawCircle(mCenterX,?mCenterY,?mRadius,?mCirclePaint);

//?draw?eyes

floateyeRadius?=?mRadius?/?5f;

floateyeOffsetX?=?mRadius?/?3f;

floateyeOffsetY?=?mRadius?/?3f;

canvas.drawCircle(mCenterX?-?eyeOffsetX,?mCenterY?-?eyeOffsetY,?eyeRadius,?mEyeAndMouthPaint);

canvas.drawCircle(mCenterX?+?eyeOffsetX,?mCenterY?-?eyeOffsetY,?eyeRadius,?mEyeAndMouthPaint);

//?draw?mouth

floatmouthInset?=?mRadius?/3f;

mArcBounds.set(mouthInset,?mouthInset,?mRadius?*?2?-?mouthInset,?mRadius?*?2?-?mouthInset);

canvas.drawArc(mArcBounds,?45f,?90f,false,?mEyeAndMouthPaint);

}

6.添加你的View

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="match_parent"

android:layout_height="match_parent"/>

到此就結(jié)束了,自定義View沒你想的那么難

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容