天天看點

Android-6步教你自定義View

如果你打算完全定制一個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

繼續閱讀