記錄下自己學習自定義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ū)別。如下圖所示
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);
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 像素的位置畫一條直線
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代表強制移動過去,也就是沒有痕跡,反之則有痕跡。還是看圖
addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle)
這個方法也是畫弧形的方法。 只不過這個方法沒有forceMoveTo,在內(nèi)部設置了forceMoveTo = true。是arcTo的簡化版。
close() 封閉當前子圖形
它的作用是把當前的子圖形封閉,即由當前位置向當前子圖形的起點繪制一條直線。因此,close()?和?lineTo(起點坐標)?是完全等價的。