Android自定義View高級(jí)(二)-Canvas繪制圖形

一.Canvas簡(jiǎn)介

Canvas我們可以稱(chēng)之為畫(huà)布,能夠在上面繪制各種東西,是安卓平臺(tái)2D圖形繪制的基礎(chǔ),非常強(qiáng)大。

二.Canvas的常用操作

操作類(lèi)型 相關(guān)API 備注
繪制顏色 drawColor, drawRGB, drawARGB 使用單一顏色填充整個(gè)畫(huà)布
繪制基本形狀 drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc 依次為 點(diǎn)、線、矩形、圓角矩形、橢圓、圓、圓弧
繪制圖片 drawBitmap, drawPicture 繪制位圖和圖片
繪制文本 drawText, drawPosText, drawTextOnPath 依次為 繪制文字、繪制文字時(shí)指定每個(gè)文字位置、根據(jù)路徑繪制文字
繪制路徑 drawPath 繪制路徑,繪制貝塞爾曲線時(shí)也需要用到該函數(shù)
頂點(diǎn)操作 drawVertices, drawBitmapMesh 通過(guò)對(duì)頂點(diǎn)操作可以使圖像形變,drawVertices直接對(duì)畫(huà)布作用、 drawBitmapMesh只對(duì)繪制的Bitmap作用
畫(huà)布剪裁 clipPath, clipRect 設(shè)置畫(huà)布的顯示區(qū)域
畫(huà)布快照 save, restore, saveLayerXxx, restoreToCount, getSaveCount 依次為 保存當(dāng)前狀態(tài)、 回滾到上一次保存的狀態(tài)、 保存圖層狀態(tài)、 回滾到指定狀態(tài)、 獲取保存次數(shù)
畫(huà)布變換 translate, scale, rotate, skew 依次為 位移、縮放、 旋轉(zhuǎn)、錯(cuò)切
Matrix(矩陣) getMatrix, setMatrix, concat 實(shí)際上畫(huà)布的位移,縮放等操作的都是圖像矩陣Matrix, 只不過(guò)Matrix比較難以理解和使用,故封裝了一些常用的方法。

三.Canvas詳解

繪制顏色

繪制顏色是填充整個(gè)畫(huà)布,常用于繪制底色。

  @Override
    protected void onDraw(Canvas canvas)
    {
        canvas.drawColor(Color.RED); //繪制紅色
    }
a.jpg

創(chuàng)建畫(huà)筆

要想繪制內(nèi)容,首先需要先創(chuàng)建一個(gè)畫(huà)筆,如下:

   //創(chuàng)建畫(huà)筆
   private Paint mPaint = new Paint();

   /**
     * 初始化一些的內(nèi)容,和獲取自定義屬性。
     * @param context
     * @param attrs
     */

    public CustomView(Context context, AttributeSet attrs)
    {
        super(context, attrs);

        //初始化畫(huà)筆
        initPaint();
    }

    private void initPaint()
    {
        //設(shè)置畫(huà)筆顏色
        mPaint.setColor(Color.RED);
        //設(shè)置畫(huà)筆模式
        mPaint.setStyle(Paint.Style.FILL);
        //設(shè)置畫(huà)筆寬度
        mPaint.setStrokeWidth(10f);
        //設(shè)置抗鋸齒
        mPaint.setAntiAlias(true);
    }

繪制點(diǎn)

可以繪制一個(gè)點(diǎn),也可以繪制一組點(diǎn),如下:

  @Override
    protected void onDraw(Canvas canvas)
    {
        canvas.drawColor(Color.RED); //繪制紅色
        //在坐標(biāo)(350,400處畫(huà)一個(gè)點(diǎn)
        canvas.drawPoint(350,400,mPaint);
        canvas.drawPoint(300,400,mPaint);
        //畫(huà)多個(gè)點(diǎn)
        canvas.drawPoints(new float[]{400,400,400,500,400,600,400,700,400,800,400,900},mPaint);
    }

b.jpg

繪制直線

繪制直線需要兩個(gè)點(diǎn),初始點(diǎn)和結(jié)束點(diǎn),同樣繪制直線也可以繪制一條或者繪制一組

        //在坐標(biāo)(100,100)和(600,100)之間畫(huà)一條線
        canvas.drawLine(100,100,600,100,mPaint);
        //畫(huà)多條線
        canvas.drawLines(new float[]{100,150,600,150,100,200,600,200,100,250,600,250},mPaint);
c.jpg

繪制矩形

確定確定一個(gè)矩形最少需要四個(gè)數(shù)據(jù),就是對(duì)角線的兩個(gè)點(diǎn)的坐標(biāo)值,這里一般采用左上角和右下角的兩個(gè)點(diǎn)的坐標(biāo)。


// 第一種
canvas.drawRect(100,100,800,400,mPaint);

// 第二種
Rect rect = new Rect(100,100,800,400);
canvas.drawRect(rect,mPaint);

// 第三種
RectF rectF = new RectF(100,100,800,400);
canvas.drawRect(rectF,mPaint);

注:Rect和RectF兩者最大的區(qū)別就是精度不同,Rect是int(整形)的,而RectF是float(單精度浮點(diǎn)型)的。

d.jpg

繪制圓角矩形

   //繪制圓角矩形
   RectF rectF = new RectF(100,100,600,300);
   canvas.drawRoundRect(rectF,20,20,mPaint);
e.jpg

繪制橢圓

相對(duì)于繪制圓角矩形,繪制橢圓就簡(jiǎn)單的多了,因?yàn)樗恍枰粋€(gè)矩形矩形作為參數(shù)

  //繪制橢圓
  RectF rectF = new RectF(100,100,600,400);
  canvas.drawOval(rectF,mPaint);
f.jpg

繪制圓

    // 繪制一個(gè)圓心坐標(biāo)在(360,400),半徑為300 的圓。
    canvas.drawCircle(360,400,300,mPaint);
g.jpg

繪制圓弧

public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint){}

從上面可以看出,相比于繪制橢圓,繪制圓弧還多了三個(gè)參數(shù):

//開(kāi)始角度
startAngle  
//掃過(guò)角度
sweepAngle  
//是否使用中心
useCenter   

直接上代碼:


        RectF rectF = new RectF(100,100,600,600);
        // 繪制背景矩形
        mPaint.setColor(Color.GRAY);
        canvas.drawRect(rectF,mPaint);
        // 繪制圓弧(不使用中心點(diǎn))
        mPaint.setColor(Color.BLUE);
        canvas.drawArc(rectF,0,90,false,mPaint);
        

        RectF rectF1 = new RectF(100,700,600,1200);
        // 繪制背景矩形
        mPaint.setColor(Color.GRAY);
        canvas.drawRect(rectF1,mPaint);
        // 繪制圓弧(使用中心點(diǎn))
        mPaint.setColor(Color.BLUE);
        canvas.drawArc(rectF1,0,90,true,mPaint);

h.jpg

四.Paint介紹

如果我們想繪制一個(gè)圓,只要邊不要里面的顏色怎么辦?

很簡(jiǎn)單,繪制的基本形狀由Canvas確定,但繪制出來(lái)的顏色,具體效果則由Paint確定。

我們可以給Paint設(shè)置style

//設(shè)置畫(huà)筆模式為填充
mPaint.setStyle(Paint.Style.FILL);  
Paint.Style 描述
STROKE 描邊
FILL 填充
FILL_AND_STROKE 描邊加填充

參考文章

@GcsSloop:安卓自定義View進(jìn)階-Canvas之繪制圖形

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容