1. 程式人生 > >Android 自定義View之繪圖工具類Canvas+Paint+Path(onDraw方法)基礎詳解

Android 自定義View之繪圖工具類Canvas+Paint+Path(onDraw方法)基礎詳解

本章節講述三個繪圖工具類Canvas(畫布),Paint(畫筆),Path(路徑)

1.Canvas(畫布)相關方法詳解

1.1.

方法:Canvas()

作用:建立一個空的畫布,可以使用setBitmap()方法來設定繪製具體的畫布。(構造方法)。

1.2.

方法:Canvas(Bitmap bitmap):

作用:以bitmap物件建立一個畫布,將內容都繪製在bitmap上,因此bitmap不得為null。(構造方法)。

1.3.

方法:drawRect(RectF rect, Paint paint)

作用:繪製區域,引數一為RectF一個區域。

1.4.

方法:drawPath(Path path, Paint paint) 

作用:繪製一個路徑,引數一為Path路徑物件。

1.5.

方法:drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) 

作用:貼圖,引數一就是我們常規的Bitmap物件,引數二是源區域(這裡是bitmap), 引數三是目標區域(應該在canvas的位置和大小),引數四是Paint畫刷物件, 因為用到了縮放和拉伸的可能,當原始Rect不等於目標Rect時效能將會有大幅損失。

1.6.

方法:drawLine(float startX, float startY, float stopX, float stopY, Paintpaint)

作用:畫線,引數一起始點的x軸位置,引數二起始點的y軸位置,引數三終點的x軸水平位置, 引數四y軸垂直位置,最後一個引數為Paint 畫刷物件。

1.7.

方法:drawPoint(float x, float y, Paint paint)

作用:畫點,引數一水平x軸,引數二垂直y軸,第三個引數為Paint物件。

1.8.

方法:drawText(String text, float x, floaty, Paint paint)

作用:渲染文字,Canvas類除了上面的還可以描繪文字,引數一是String型別的文字, 引數二x軸,引數三y軸,引數四是Paint物件。

1.9.

方法:drawOval(RectF oval, Paint paint)

作用:畫橢圓,引數一是掃描區域,引數二為paint物件。

1.10.

方法:drawCircle(float cx, float cy, float radius,Paint paint)

作用:繪製圓,引數一是中心點的x軸,引數二是中心點的y軸,引數三是半徑,引數四是paint物件。

1.11.

方法:drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)

作用:畫弧,引數一是RectF物件,一個矩形區域橢圓形的界限用於定義在形狀、大小、電弧,引數二是起始角 (度)在電弧的開始,引數三掃描角(度)開始順時針測量的,引數四是如果這是真的話,包括橢圓中心的電 弧,並關閉它,如果它是假這將是一個弧線,引數五是Paint物件。

1.12.

方法:clipRect(new Rect())

作用:在當前的畫圖區域裁剪(clip)出一個新的畫圖區域,這個畫圖區域就是canvas 物件的當前畫圖區域了。此方法該矩形區域就是canvas的當前畫圖區域。

1.13.

方法:save()

作用:用來儲存Canvas的狀態。

1.14.

方法:restore()

作用:用來恢復Canvas之前儲存的狀態。防止save後對Canvas執行的操作對後續的繪製有影響。

save()和restore()要配對使用(restore可以比save少,但不能多),若restore呼叫次數比save多,會報錯。

1.15.

方法:translate(float dx, float dy)

作用:平移,將畫布的座標原點向左右方向移動x,向上下方向移動y.canvas的預設位置是在(0,0)。

1.6.

方法:scale(float sx, float sy)

作用:擴大,x為水平方向的放大倍數,y為豎直方向的放大倍數。

1.7.

方法:rotate(float degrees)

作用:旋轉,angle指旋轉的角度,順時針旋轉。

2.Paint(畫筆)相關方法詳解

2.1.

方法:Paint( )

作用:Paint paint = new Paint( )。

2.2.

方法:setARGB(int a,int r,int g,int b)

作用:設定繪製的顏色,a代表透明度,r,g,b代表顏色值。

2.3.

方法:setAlpha(int a)

作用:設定繪製圖形的透明度。

2.4.

方法:setColor(int color)

作用:設定繪製的顏色,使用顏色值來表示,該顏色值包括透明度和RGB顏色。

2.5.

方法:setAntiAlias(boolean aa)

作用:設定是否使用抗鋸齒功能,會消耗較大資源,繪製圖形速度會變慢。

2.6.

方法:setDither(boolean dither)

作用:設定是否使用影象抖動處理,會使繪製出來的圖片顏色更加平滑和飽滿,影象更加清晰。

2.7.

方法:setFilterBitmap(boolean filter)

作用:如果該項設定為true,則影象在動畫進行中會濾掉對Bitmap影象的優化操作, 加快顯示速度,本設定項依賴於dither和xfermode的設定。

2.8.

方法:setMaskFilter(MaskFilter maskfilter)

作用:設定MaskFilter,可以用不同的MaskFilter實現濾鏡的效果,如濾化,立體等。

2.9.

方法:setColorFilter(ColorFilter colorfilter)

作用:設定顏色過濾器,可以在繪製顏色時實現不用顏色的變換效果。

2.10.

方法:setPathEffect(PathEffect effect)

作用:設定繪製路徑的效果,如點畫線等。

2.11.

方法:setShader(Shader shader)

作用:設定影象效果,使用Shader可以繪製出各種漸變效果。

2.12.

方法:setShadowLayer(float radius ,float dx,float dy,int color)

作用:在圖形下面設定陰影層,產生陰影效果, radius為陰影的角度,dx和dy為陰影在x軸和y軸上的距離,color為陰影的顏色。

2.13.

方法:setStyle(Paint.Style style)

作用:設定畫筆的樣式,為FILL,FILL_OR_STROKE,或STROKE。

2.14.

方法:setStrokeCap(Paint.Cap cap)

作用:當畫筆樣式為STROKE或FILL_OR_STROKE時,設定筆刷的圖形樣式, 如圓形樣Cap.ROUND,或方形樣式Cap.SQUARE。

2.15.

方法:setSrokeJoin(Paint.Join join)

作用:設定繪製時各圖形的結合方式,如平滑效果等。

2.16.

方法:setStrokeWidth(float width)

作用:當畫筆樣式為STROKE或FILL_OR_STROKE時,設定筆刷的粗細度。

2.17.

方法:setXfermode(Xfermode xfermode)

作用:設定圖形重疊時的處理方式,如合併,取交集或並集,經常用來製作橡皮的擦除效果。

2.18.

方法:setFakeBoldText(boolean fakeBoldText)

作用:模擬實現粗體文字,設定在小字型上效果會非常差。

2.19.

方法:setSubpixelText(boolean subpixelText)

作用:設定該項為true,將有助於文字在LCD螢幕上的顯示效果。

2.20.

方法:setTextAlign(Paint.Align align)

作用:設定繪製文字的對齊方向。

2.21.

方法:setTextScaleX(float scaleX)

作用:設定繪製文字x軸的縮放比例,可以實現文字的拉伸的效果。

2.22.

方法:setTextSize(float textSize)

作用:設定繪製文字的字號大小。

2.23.

方法:setTextSkewX(float skewX)

作用:設定斜體文字,skewX為傾斜弧度。

2.24.

方法:setTypeface(Typeface typeface)

作用:設定Typeface物件,即字型風格,包括粗體,斜體以及襯線體,非襯線體等。

2.25.

方法:setUnderlineText(boolean underlineText)

作用:設定帶有下劃線的文字效果。

2.26.

方法:setStrikeThruText(boolean strikeThruText)

作用:設定帶有刪除線的效果。

2.27.

方法:setStrokeJoin(Paint.Join join)

作用:設定結合處的樣子,Miter:結合處為銳角, Round:結合處為圓弧:BEVEL:結合處為直線。

2.28.

方法:setStrokeMiter(float miter)

作用:設定畫筆傾斜度。

2.29.

方法:setStrokeCap (Paint.Cap cap)

作用:設定轉彎處的風格。

2.30.

方法:float ascent( )

作用:測量baseline之上至字元最高處的距離。

2.31.

方法:float descent()

作用:baseline之下至字元最低處的距離。

2.32.

方法:int breakText(char[] text, int index, int count, float maxWidth, float[] measuredWidth)

作用:檢測一行顯示多少文字。

2.33.

方法:clearShadowLayer( )

作用:清除陰影層。

3.Path(路徑)相關方法詳解

3.1.

方法:addArc(RectF oval, float startAngle, float sweepAngle)

作用:為路徑新增一個多邊形。

3.2.

方法:addCircle(float x, float y, float radius, Path.Direction dir)

作用:給path新增圓圈。

3.3.

方法:addOval(RectF oval, Path.Direction dir)

作用:新增橢圓形。

3.4.

方法:addRect(RectF rect, Path.Direction dir)

作用:新增一個區域。

3.5.

方法:addRoundRect(RectF rect, float[] radii, Path.Direction dir)

作用:新增一個圓角區域。

3.6.

方法:isEmpty()

作用:判斷路徑是否為空。

3.7.

方法:transform(Matrix matrix)

作用:應用矩陣變換。

3.8.

方法:transform(Matrix matrix, Path dst)

作用:應用矩陣變換並將結果放到新的路徑中,即第二個引數。

3.9.

方法:moveTo(float x, float y)

作用:不會進行繪製,只用於移動移動畫筆。

3.10.

方法:lineTo(float x, float y)

作用:用於直線繪製,預設從(0,0)開始繪製,用moveTo移動! 比如 mPath.lineTo(300, 300); canvas.drawPath(mPath, mPaint)。

3.11.

方法:quadTo(float x1, float y1, float x2, float y2)

作用:用於繪製圓滑曲線,即貝塞爾曲線,同樣可以結合moveTo使用。

3.12.

方法:rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3)

作用:同樣是用來實現貝塞爾曲線的。 (x1,y1) 為控制點,(x2,y2)為控制點,(x3,y3) 為結束點。  

3.13.

方法:arcTo(RectF oval, float startAngle, float sweepAngle)

作用:繪製弧線(實際是擷取圓或橢圓的一部分)ovalRectF為橢圓的矩形,startAngle 為開始角度, sweepAngle 為結束角度。

4.例項Demo

4.1.基礎程式碼

public class MyView extends View{


    private Paint paint;


    public MyView(Context context) {
        super(context);
        init();
    }


    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }


    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }


    private void init(){
        paint = new Paint();
        paint.setAntiAlias(true);//抗鋸齒
        paint.setColor(Color.RED);//畫筆顏色
        paint.setStyle(Paint.Style.FILL);//畫筆風格
        paint.setTextSize(30);//繪製文字大小,單位px
        paint.setStrokeWidth(5);//畫筆粗細
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }
}

4.2.使用

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <com.wjn.sqlitedemo.view.MyView
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_centerInParent="true" />



</RelativeLayout>

4.3.操作onDraw方法

此View寬度和高度相同,所以下面使用View高度寬度使用的都是寬度

4.3.1.canvas.drawColor(Color.GREEN);//設定畫布背景顏色

4.3.2.畫實心圓

canvas.drawCircle(getWidth()/2, getWidth()/2, getWidth()/2, paint);//畫實心圓

cx:圓心座標X軸 cy:圓心座標Y軸 radius:半徑

4.3.3.畫矩形

left:距離左邊間距 top:距離上面間距 right:距離右邊間距 bottom:距離下面間距

canvas.drawRect(0, getWidth()/4, getWidth(), getWidth()/4*3, paint);//畫矩形

4.3.4.繪製Bitmap

nvas.drawBitmap(bitmap, getWidth()/2-bitmap.getWidth()/2, getWidth()/2-bitmap.getHeight()/2, paint);

left:Bitmap紅點處X軸 top:Bitmap紅點處Y軸

4.3.5.繪製弧形區域

oval:矩形 如4.3.3 startAngle:起始角度 sweepAngle:圓弧轉過的角度 useCenter:是否顯示圓弧的三角形

RectF rectF=new RectF(0, getWidth()/4, getWidth(), getWidth()/4*3);

canvas.drawArc(rectF,0,100,true,paint);

RectF rectF=new RectF(0, getWidth()/4, getWidth(), getWidth()/4*3);

canvas.drawArc(rectF,0,100,false,paint);

4.3.6.繪製圓角矩形

rect:如4.3.3 rx:X軸圓角度 ry:Y軸圓角度

RectF rectF=new RectF(20, getWidth()/4, getWidth()-20, getWidth()/4*3);

canvas.drawRoundRect(rectF,15,15,paint); //畫圓角矩形

4.3.7.繪製橢圓

oval:如4.3.3

RectF rectF=new RectF(20, getWidth()/4, getWidth()-20, getWidth()/4*3);

canvas.drawOval(rectF,paint); //畫橢圓

4.3.8.繪製文字

text:要顯示的文字 x:文字起始X軸 y:文字起始Y軸

canvas.drawText("這是自定義的文字",20,getWidth()/2,paint);//繪製文字

附1:Canvas官方連結

http://androiddoc.qiniudn.com/reference/android/graphics/Canvas.html

附2:Paint官方連結

http://androiddoc.qiniudn.com/reference/android/graphics/Paint.html

附3:Path官方連結

http://androiddoc.qiniudn.com/reference/android/graphics/Path.html