自定義View(一) 繪制基礎

記錄下自己學習自定義View的過程。共勉

首先,在我們創(chuàng)建的自定義View中 重寫onDraw()方法。如下

@Overrideprotected void onDraw(Canvas canvas){

????super.onDraw(canvas);

}

我們知道,自定義View需要畫筆和畫布。在onDraw()方法中,參數(shù)canves就是我們所需要的畫布,對于畫筆,我們需要自己創(chuàng)建一下

Paint paint = new Paint();

這兩樣東西都創(chuàng)建好了之后,就可以開始繪制了。

一、Canves.drawXXX

我們先來看一下Canves的一些常用方法

Canvas.drawColor(@ColorInt int color) 顏色填充

這是最基本的方法,例如?drawColor(Color.BLACK)?會把整個區(qū)域染成純黑色,覆蓋掉原有內(nèi)容;

drawColor(Color.parse("#FF0000")?會把整個區(qū)域染成紅色

當然也有其他顏色方法,如drawRGB(int r, int g, int b)?和?drawARGB(int a, int r, int g, int b)方法。

drawCircle(float centerX, float centerY, float radius, Paint paint) 畫圓

畫圓方法有四個參數(shù)。前兩個參數(shù)代表了圓的圓心坐標,radius代表半徑,paint代表我們的畫筆工具。

canvas.drawCircle(300,300,200, paint);

上述代碼即為畫一個圓心在(300,300)位置,半徑為200的圓形。

在這里我們需要注意,Android的坐標系和我們在數(shù)學上學的坐標系有區(qū)別。如下圖所示


Android坐標系


繪制圓形

drawRect(float left, float top, float right, float bottom, Paint paint) 畫矩形

對于上面這個方法,前面四個參數(shù)是矩形四條邊的坐標。

canvas.drawRect(100, 100, 500, 500, paint);

除此之外,還有以下重載方法


我們可以創(chuàng)建Rect對象或者RectF對象,來完成此方法。

那么有人可能會問,這兩個東西有啥區(qū)別啊?其實,這兩個都可以描述矩形,只是他們的參數(shù)的單位不同。

Rect參數(shù)的單位是int,而RectF參數(shù)的單位則是float。因此RectF的精度會比Rect準確那么一丟丟。

drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint) 畫圓角矩形

四個參數(shù)left,?top,?right,?bottom?是四條邊的坐標,rx?和?ry?是圓角的橫向半徑和縱向半徑

canvas.drawRoundRect(100, 100, 500, 300, 50, 50, paint);

就是長這樣的


圓角矩形

drawPoint(float x, float y, Paint paint) 畫點

x?和?y?是點的坐標。

canvas.drawPoint(50, 50, paint);

drawOval(float left, float top, float right, float bottom, Paint paint) 畫橢圓

四個參數(shù)left,?top,?right,?bottom?是這個橢圓的左、上、右、下四個邊界點的坐標。

canvas.drawOval(50, 50, 700, 200, paint);

另外,它還有一個重載方法?drawOval(RectF rect, Paint paint),你可以直接填寫?RectF?來繪制橢圓。

drawLine(float startX, float startY, float stopX, float stopY, Paint paint) 畫線

startX,?startY,?stopX,?stopY?分別是線的起點和終點坐標。

canvas.drawLine(200, 200, 800, 500, paint);

drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 繪制弧形或扇形

drawArc()?是使用一個橢圓來描述弧形的。left,?top,?right,?bottom?描述的是這個弧形所在的橢圓。startAngle是弧形的起始角度,就是我們上面坐標系中的x軸正方向,是0度。順時針繪制為正角度,逆時針則是負角度。sweepAngle是矩形劃過的角度。useCenter代表是否連接到圓心,他也就代表的你要繪制的圖形是扇形還是一個弧形。如果連接到圓心,那么就是扇形,反之則是一個弧形。

canvas.drawArc(100, 100, 700, 500, -135, 135, true, paint); ? ?//繪制扇形

paint.setStyle(Paint.Style.STROKE);

canvas.drawArc(100, 100, 700, 500, 90, 135, false, paint); ? ? ? //繪制弧形


繪制扇形

drawBitmap(Bitmap bitmap, float left, float top, Paint paint) 畫 Bitmap





以上就是Canves繪制基本圖形的一些方法。接下來我們了解一下Paint畫筆的方法。

二、Paint

paint.setColor(int color)

這個方法是給畫筆設置顏色,比如你想畫一個帶顏色的圓,你需要這么做

paint.setColor(Color.RED); // 設置為紅色

canvas.drawCircle(300, 300, 200, paint);

這樣你畫出來的圓就是一個紅色的了。

?paint.setStyle(Paint.Style style)

這個方法是設置畫筆的style。這個Style是個枚舉,里面包含F(xiàn)ILL,STROKE,FILL_AND_STROKE三種類型。

STROKE代表畫線,你看個圖就懂了。

paint.setStyle(Paint.Style.STROKE);

canvas.drawCircle(300, 300, 200, paint);


stroke

paint.setStrokeWidth(float width)

如果你設置style為STROKE?和?FILL_AND_STROKE,則可以使用此方法。意思為設置線的寬度。

paint.setAntiAlias()

此方法意為開啟抗鋸齒。當然,你也可以使用這種方式來開啟抗鋸齒。在初始化畫筆的時候使用。

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

了解了canves基本圖形的畫法和paint的一些常用方法,我們來了解一下drawPath()方法

三、canves.drawPath()

addCircle(float x, float y, float radius, Direction dir) 添加圓

x,y,radius是圓的基本參數(shù),最后一個參數(shù)dir代表畫圓的路徑的方向。

方向分為兩種,一種是CW,即順時針,另外一種是CCW,逆時針。平時我們畫圓,使用哪種都可以。但是涉及到圖形相交的時候,我們需要考慮下使用哪種方向。

path.addCircle(300, 300, 200, Path.Direction.CW);

canvas.drawPath(path, paint);

你會發(fā)現(xiàn),這樣畫出的效果和我們剛才使用canves,drawCircle()方法繪制出的效果是一樣的。所以說如果只是想畫一個圓,使用drawCircle()方法更方便。

其他一些方法,比如addRect(),addOval(),addOval()效果都一樣的。

lineTo(float x, float y)?

rLineTo(float x, float y) 畫直線

這是一個畫直線的方法,x,y是目標位置的坐標。初始坐標為(0,0)

lineTo(x,y)的參數(shù)是絕對坐標,rLineto則是相對坐標,就是相對于上次移動之后的那個點的坐標。看下圖就明白了。、

path.lineTo(300, 300); // 由當前位置 (0, 0) 向 (300, 300) 畫一條直線

path.lineTo(300, 0); // 由當前位置 (300, 300) 向正右方 300 像素的位置畫一條直線


lineTo
rLineTo

moveTo(float x, float y) ?移動到目標位置

path.moveTo(200,100); ? ? ? //? 將坐標位置移動到(200,100)

arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo) 畫弧形

這個方法和 drawArc()?比起來,少了一個參數(shù)?useCenter,說明這個方法只畫弧形,不畫扇形;而多了一個參數(shù)?forceMoveTo的意思是 繪制是要「抬一下筆移動過去」,還是「直接拖著筆過去」,區(qū)別在于是否留下移動的痕跡。froceMoveTo為true代表強制移動過去,也就是沒有痕跡,反之則有痕跡。還是看圖


forceMoveTo 為true


?forceMoveTo?為false

addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle)

這個方法也是畫弧形的方法。 只不過這個方法沒有forceMoveTo,在內(nèi)部設置了forceMoveTo = true。是arcTo的簡化版。

close() 封閉當前子圖形

它的作用是把當前的子圖形封閉,即由當前位置向當前子圖形的起點繪制一條直線。因此,close()?和?lineTo(起點坐標)?是完全等價的。









最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • HenCoder 原文 關鍵點 自定義繪制方法的重寫,其中最常用的是onDraw 繪制的關鍵是Canvas的使用C...
    李小神不偷懶閱讀 538評論 4 1
  • 自定義繪制概述 方法:重寫繪制方法(最常用:onDraw()) 繪制的關鍵:CanvasCanvas的繪制類方法:...
    NewSalton閱讀 466評論 0 0
  • 系列文章之 Android中自定義View(一)系列文章之 Android中自定義View(二)系列文章之 And...
    YoungerDev閱讀 4,467評論 3 11
  • 文/傾慕如歌 人面桃花相映紅,片片芳菲落離殤。 鍥子 他是花神之后,她是宮中公主。一次邂逅,不知是亂了誰的心扉,誤...
    summer涼末閱讀 445評論 2 4
  • 很多家長為了節(jié)省時間,或者為了在孩子面前表示自己懂得很多,往往喜歡就孩子提出的問題馬上而直接地給出答案(或者是家長...
    第6通道閱讀 259評論 0 0