如果你打算完全定制一個(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沒你想的那么難