理解path,canvas畫各種形狀

                                               path 用法

  1. path與canvas關係

         path就是描點器它需要用畫筆paint來將這些點連接起來,最後用canvas畫布來展現這些圖畫。


   2. Path的各種方法

首先解釋一下 Path.Direction dir這個參數

         用來指定添加到path中的模型(比如方形,橢圓)的閉合方向,有兩個值

CCW 表示逆時針,CW 表示順時針

        下面方法:

public void addArc (RectF oval, float startAngle, float sweepAngle)

將一段弧線加入到path中作爲一個新的輪廓,該弧線由oval,startAngle,sweepAngle三者決定

public void addCircle (float x, float y, float radius, Path.Direction dir)

增加一個閉合的圓形到path中,dir表示閉合的方向  

public void addOval (RectF oval, Path.Direction dir)

增加一個閉合的矩形到path中

public void addPath (Path src, float dx, float dy)

將src平移dx,dy後添加到path當中

public void addPath (Path src)

將src添加到path當中

public void addPath (Path src, Matrix matrix)

將src通過matrix變換後添加到Path當中

public void addRect (float left, float top, float right, float bottom, Path.Direction dir)

增加一個閉合的矩形到path當中

public void addRect (RectF rect, Path.Direction dir)

增加一個閉合的矩形到path當中

public void addRoundRect (RectF rect, float[] radii, Path.Direction dir)

增加一個閉合的圓角矩形到path當中,radii表示各個角的半徑點x,y,依次是左上角,右上角,右下角,左下角

public void addRoundRect (RectF rect, float rx, float ry, Path.Direction dir)

增加一個閉合的圓角矩形到path當中,rx,ry表示各個角的半徑點

public void arcTo (RectF oval, float startAngle, float sweepAngle)

將一段圓弧連接到path當中,如果path的最後一個點和圓弧的第一個點不一樣,那麼就會先通過lineTo()將這兩個點連接起來,然後再連接圓弧。當然,如果path是空的,那就會調用moveTo()把path的第一個點移到圓弧的第一個點上來

public void arcTo (RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo)

同上,sweepAngle的值在應用的過程中會到360求模,forceMoveTo如果是true,那麼圓弧會一直顯示一個新的輪廓

public void close ()

關閉當前輪廓,如果當前點和該輪廓的第一個點不一樣,會自動的用一條直接連接該兩點

public void computeBounds (RectF bounds, boolean exact)

計算path中控制的點的邊界,將結果寫入bounds中,如果Path中只有0或者1個點,那麼bounds會返回(0,0,0,0)的值,exact這個變量沒用

public void cubicTo (float x1, float y1, float x2, float y2, float x3, float y3)

從最後一個點開始增加一段貝塞爾曲線到path當中,接近(x1,y1),(x2,y2),同時在(x3,y3)中結束,如果這個輪廓沒有調用過moveTo(),那麼將會以(0,0)作爲起點

public Path.FillType getFillType ()

獲取path的填充方式,這定義了在內部的計算方法,默認值爲WINDING

public void incReserve (int extraPtCount)

提示path將會增加extraPtCount個點,這能使path有效率的分配它的存儲空間

public boolean isEmpty ()

查詢path是否爲空(不包括任何直線,曲線)

public boolean isInverseFillType ()

判斷filltype是否爲INVERSE中的一種

public boolean isRect (RectF rect)

如果path指定了一個矩形,那麼返回true,並且rect將會存儲path的邊界值,如果沒有指定一個矩形,返回false,並且忽略掉rect

public void lineTo (float x, float y)

將path的最後一個點連接點(x,y),如果path還沒調用moveTo的話,將(0,0)點連接到(x,y)

public void moveTo (float x, float y)

設置下一個輪廓的第一個點

public void offset (float dx, float dy, Path dst)

將path平移dx,dy之後,將結果寫到dst中,如果dst爲null,那麼改變後的結果直接寫在當前path中

public void offset (float dx, float dy)

同上,只不過就是dst=null的情形

public void quadTo (float x1, float y1, float x2, float y2)

增加一條二次的貝塞爾曲線到path的最後一個點,接近(x1,y1),在(x2,y2)點結束。如果path沒有調用moveTo來確定第一個點,那第一個點設置爲(0,0)

public void rCubicTo (float x1, float y1, float x2, float y2, float x3, float y3)

跟cubicTo相同,但是參數裏的這些點座標會被考慮當前輪廓的相對位置


public void reset ()

清空Path的任何直線和曲線,讓它變成空,但是不會改變filltype

public void rewind ()

rewind當前path,清除掉所有直線,曲線,但是保留它內部的數據結構,以便更好的重新使用

public void set (Path src)

用src的值替代當前path的值

public void setFillType (Path.FillType ft)

設置當前path的filltype

public void setLastPoint (float dx, float dy)

設置當前path的最後一個點

public void toggleInverseFillType ()

套住filltype的inverse狀態

public void transform (Matrix matrix, Path dst)

將path進行matrix變化後,將結果保存到dst當中,如果dst=null,將結果保存到當前path當中

public void transform (Matrix matrix)

同上,相當於dst=null情形

3. 最後寫一個小例子主要是用path畫了一個柱形的圖形

   這裏只寫了一個Activity

<pre name="code" class="java">public class MyActivity extends Activity {
private RelativeLayout rect;
    private ChartView view;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        rect= (RelativeLayout) findViewById(R.id.rect);
        view=new ChartView(this);
        rect.addView(view);
    }



}




public class ChartView extends View {
    public ChartView(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint=new Paint();
        paint.setColor(Color.BLUE);
        paint.setStrokeWidth(2);
        Path path=new Path();
        path.addRect(200,100,300,500,Path.Direction.CCW);
        canvas.drawPath(path,paint);
        RectF rect=new RectF();
      rect.set(400,150,500,500);
      path.addRect(rect,Path.Direction.CCW);
        canvas.drawPath(path,paint);


    }


最後界面上就顯現出一兩個柱子了



發佈了74 篇原創文章 · 獲贊 7 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章