Android中自繪View教程之Paint和Canvas類講解

今天這篇文章將會在onDraw上來講解一些常用的繪制知識。好瞭,那我們就先來瞭解一下Paint和Canvas這兩個類。

Paint

Paint就是畫筆,在繪制過程中,Paint決定瞭繪出的方式,包括筆的粗細、顏色,等。Paint有很多設置的方法,下面列出一些比較常用的set方法:

設置繪制的透明度和顏色

setARGB(int a, int r, int g, int b)

setAlpha(int a)

setColor(int color)

設置是否使用抗鋸齒。若設為true,會使繪出的圖形更加圓滑,但也會消耗一定的資源,等價於setFlags(Paint.ANTI_ALIAS_FLAG);

setAntiAlias(boolean aa);

設定是否使用圖像抖動處理,會使繪制出來的圖片顏色更加平滑和飽滿,圖像更加清晰。若設為true,等價於setFlags(Paint.DITHER_FLAG);

setDither(boolean dither);

設置畫筆的樣式,值有:Style.FILL(填充)、Style.STROKE(描邊)和 Style.FILL_OR_STROKE(同時填充和描邊,用得比較少)

setStyle(Paint.Style style);

當setStyle為STROKE或FILL_OR_STROKE時,設置畫筆的粗細度

setStrokeWidth(float width);

當setStyle為STROKE或FILL_OR_STROKE時,設置畫筆的圖形樣式,值有:Cap.BUTT、Cap.ROUND(圓形樣式)和 Cap.SQUARE(方形樣式)

setStrokeCap(Paint.Cap cap);

設置圖像效果,使用Shader可以繪制出各種漸變效果

setShader(Shader shader);

設置繪制文字的字號大小

setTextSize(float textSize);

設置繪制文字的Typeface對象,即字體風格,包括粗體,斜體以及襯線體,非襯線體等

setTypeface(Typeface typeface);

設置繪制文字模擬粗體效果,註意是模擬的,在小字體上效果會非常差

setFakeBoldText(boolean fakeBoldText);

設置繪制文字斜體效果,skewX為傾斜弧度

setTextSkewX(float skewX);

設置繪制文字帶有下劃線的效果

setUnderlineText(boolean underlineText);

設置繪制文字帶有刪除線的效果

setStrikeThruText(booleanstrikeThruText);

設置繪制文字的對齊方向

setTextAlign(Paint.Align align);

設置繪制文字的間隔,默認值:0

setLetterSpacing(float letterSpacing);

設置繪制文字x軸的縮放比例,可以實現文字的拉伸的效果,默認值:1

setTextScaleX(float scaleX);

Canvas

Paint就是畫佈,簡單說就是在上面呈現出我們想畫的東西。Canvas提供瞭很多繪制方法,下面列出一些比較常用的draw方法:

繪制整個畫佈的背景顏色

drawARGB(int a, int r, int g, int b)

drawRGB(int r, int g, int b)

drawColor(int color)

drawColor(int color, PorterDuff.Mode mode)

繪制圓弧。其中,參數startAngle表示弧開始的角度位置(默認是3點鐘位置);參數sweepAngle表示弧的飽和角度(取值0~360,360表示全閉,它是順時針掃描角度);參數useCenter若為true,則表示弧兩個邊跟圓心相連,為false,則表示弧兩個邊直接相連

drawArc(float left, float top, float right,float bottom, float startAngle, float sweepAngle, boolean useCenter, Paintpaint)

drawArc(RectF oval, float startAngle, floatsweepAngle, boolean useCenter, Paint paint)

繪制圓。其中,參數cx和cy表示圓心坐標;參數radius表示半徑長度

drawCircle(float cx, float cy, floatradius, Paint paint)

繪制直線或多樣直線

drawLine(float startX, float startY, floatstopX, float stopY, Paint paint)

drawLines(float[] pts, int offset, intcount, Paint paint)

drawLines(float[] pts, Paint paint)

繪制橢圓

drawOval(float left, float top, floatright, float bottom, Paint paint)

drawOval(RectF oval, Paint paint)

繪制點

drawPoint(float x, float y, Paint paint)

drawPoints(float[] pts, Paint paint)

drawPoints(float[] pts, int offset, intcount, Paint paint)

繪制矩形

drawRect(float left, float top, floatright, float bottom, Paint paint)

drawRect(Rect r, Paint paint)

drawRect(RectF rect, Paint paint)

繪制圓角矩形。其中,參數rx和ry分別表示x和y方向上的圓角半徑

drawRoundRect(RectF rect, float rx, floatry, Paint paint)

drawRoundRect(float left, float top, floatright, float bottom, float rx, float ry, Paint paint)

繪制文字

drawText(CharSequence text, int start, intend, float x, float y, Paint paint)

drawText(String text, float x, float y,Paint paint)

drawText(char[] text, int index, int count,float x, float y, Paint paint)

drawText(String text, int start, int end,float x, float y, Paint paint)

繪制Bitmap

drawBitmap(Bitmap bitmap, Matrix matrix,Paint paint)

drawBitmap(int[] colors, int offset, intstride, float x, float y, int width, int height, boolean hasAlpha, Paint paint)

drawBitmap(int[] colors, int offset, intstride, int x, int y, int width, int height, boolean hasAlpha, Paint paint)

drawBitmap(Bitmap bitmap, Rect src, Rectdst, Paint paint)

drawBitmap(Bitmap bitmap, Rect src, RectFdst, Paint pain

drawBitmap(Bitmap bitmap, float left, floattop, Paint paint)

繪制Picture

drawPicture(Picture picture, RectF dst)

drawPicture(Picture picture)

drawPicture(Picture picture, Rect dst)

繪制路徑,可繪制出不規則多邊形

drawPath(Path path, Paint paint)

示例

public class MyView extends View {

    private Paint mPaint;

    public MyView(Context context) {
        this(context, null, 0);
    }
    public MyView(Context context, AttributeSetattrs) {
        this(context, attrs, 0);
    }
    public MyView(Context context, AttributeSetattrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setColor(0xffff0000);
        mPaint.setStyle(Paint.Style.FILL);
    }

    // 重寫onDraw
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // 繪制一個顏色背景
        canvas.drawColor(0xffc3e8ff);

        // 繪制圓弧
        canvas.drawArc(20, 20, 220, 220, -90, 270, true, mPaint);
        canvas.drawArc(240, 20, 440, 220, -90, 270, false, mPaint);

        // 繪制橢圓
        canvas.drawOval(460, 20, 700, 220, mPaint);

        // 繪制圓
        canvas.drawCircle(120, 340, 100, mPaint);

        // 繪制直線
        canvas.drawLine(240, 240, 440, 440, mPaint);

        // 繪制點
        canvas.drawPoint(560, 340, mPaint);

        // 繪制矩形
        canvas.drawRect(20, 460, 320, 660, mPaint);

        // 繪制圓角矩形
        canvas.drawRoundRect(360, 460, 560, 660, 15, 50, mPaint);

        // 繪制路徑(這裡是梯角形)
        Path path = new Path();
        path.moveTo(90, 680);
        path.lineTo(20, 880);
        path.lineTo(350, 880);
        path.lineTo(180, 680);
       path.close();       // 在Paint為STROKE(描邊)時,最後一點是否與第一個點相連,在FILL(填充)無區別
        canvas.drawPath(path, mPaint);

        // 繪制文字
        mPaint.setTextSize(50);
        mPaint.setUnderlineText(true);
        canvas.drawText("Hello World", 370, 800, mPaint);
    }
}

運行程序在屏蔽將繪制成這樣:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *