如果你打算完全定制一個view,那麼你需要實作view類(所有的android view都實作于這個類),并且實作确定尺寸的onmeasure(…))方法和确認繪圖的ondraw(…))方法。
自定義view一共分為6步
第一步
public class smileyview extends view {
private paint mcirclepaint;
private paint meyeandmouthpaint;
private float mcenterx;
private float mcentery;
private float mradius;
private rectf marcbounds = new rectf();
public smileyview(context context) {
this(context, null);
}
public smileyview(context context, attributeset attrs) {
this(context, attrs, 0);
public smileyview(context context, attributeset attrs, int defstyleattr) {
super(context, attrs, defstyleattr);
initpaints();
private void initpaints() {/* ... */}
@override
protected void onmeasure(int widthmeasurespec, int heightmeasurespec) {/* ... */}
protected void ondraw(canvas canvas) {/* ... */}
}
2.實作畫筆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(…)方法
實作這個方法告訴了母容器如何放棄自定義view,可以通過提供的measurespecs來決定你的view的高和寬,以下是一個正方形,确認它的寬和高是一樣的。
@override
protected void onmeasure(int widthmeasurespec, int heightmeasurespec) {
int w = measurespec.getsize(widthmeasurespec);
int h = measurespec.getsize(heightmeasurespec);
int size = math.min(w, h);
setmeasureddimension(size, size);
注意:
這個方法需要至少保證一個setmeasureddimension(..)調用,否則會報illegalstateexception錯誤。
4.實作onsizechanged(…)方法
這個方法是你擷取view現在的寬和高. 這裡我們計算的是中心和半徑。
protected void onsizechanged(int w, int h, int oldw, int oldh) {
mcenterx = w / 2f;
mcentery = h / 2f;
mradius = math.min(w, h) / 2f;
5.實作ondraw(…)方法
這個方法提供了如何繪制view,它提供的canvas類可以進行繪制。
protected void ondraw(canvas canvas) {
// draw face
canvas.drawcircle(mcenterx, mcentery, mradius, mcirclepaint);
// draw eyes
float eyeradius = mradius / 5f;
float eyeoffsetx = mradius / 3f;
float eyeoffsety = mradius / 3f;
canvas.drawcircle(mcenterx - eyeoffsetx, mcentery - eyeoffsety, eyeradius, meyeandmouthpaint);
canvas.drawcircle(mcenterx + eyeoffsetx, mcentery - eyeoffsety, eyeradius, meyeandmouthpaint);
// draw mouth
float mouthinset = mradius /3f;
marcbounds.set(mouthinset, mouthinset, mradius * 2 - mouthinset, mradius * 2 - mouthinset);
canvas.drawarc(marcbounds, 45f, 90f, false, meyeandmouthpaint);
6.添加你的view
<framelayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.app.smileyview
android:layout_width="match_parent"
android:layout_height="match_parent" />
</framelayout>
到此就結束了,自定義view沒你想的那麼難
本文作者:佚名
來源:51cto