前言
既然要自定義View衫贬,那么自然少不了各種繪制,既然要繪制吆鹤,那么自然離不開Canvas和Paint宝泵,那么本篇文章就介紹一下好啰,canvas的各種drawXXX方法和Paint一些常用方法。
Android中的坐標(biāo)系
Android中的坐標(biāo)系的X軸與傳統(tǒng)的坐標(biāo)系一致儿奶,但是Y軸與傳統(tǒng)的坐標(biāo)系不同框往,方向是相反的。
Paint常用方法
Paint.setStyle(Style style) 設(shè)置繪制模式
Paint.setColor(int color) 設(shè)置顏色
Paint.setStrokeWidth(float width) 設(shè)置線條寬度
Paint.setTextSize(float textSize) 設(shè)置文字大小
-
Paint.setAntiAlias(boolean aa) 設(shè)置抗鋸齒開關(guān)
抗鋸齒關(guān)閉與開啟 -
Paint.setDither(boolean dither) 設(shè)置防抖動開關(guān)
防抖動未開啟
防抖動開啟
onDraw()
以下所有操作均是在onDraw()中進(jìn)行的闯捎,把繪制代碼寫在 onDraw() 里面椰弊,就是自定義繪制最基本的實現(xiàn)许溅。
canvas.drawColor(@ColorInt int color) 顏色填充
在整個繪制區(qū)域統(tǒng)一涂上指定的顏色,當(dāng)然你也可以傳入帶透明度的顏色秉版,達(dá)到遮罩層的效果
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.YELLOW);
}
canvas.drawCircle 畫圓
canvas.drawCircle(float centerX, float centerY, float radius, Paint paint)
-
centerX贤重,centerY:確定圓心的坐標(biāo)
-
radius:確定圓的半徑
canvas.drawCircle(300f, 300f, 200f, mPaint);
補充
Paint.setColor(int color)改變畫筆的顏色
mPaint.setColor(Color.BLUE);
canvas.drawCircle(200f, 400f, 100f, mPaint);
Paint.setStyle(Paint.Style style)改變畫筆的風(fēng)格
Style有三種,分別是FILL, STROKE 和 FILL_AND_STROKE清焕。
- FILL:填充模式(默認(rèn))
- STROKE:勾邊模式
- FILL_AND_STROKE:兩種模式一并使用并蝗,既畫線又填充
mPaint.setStyle(Paint.Style.STROKE);
canvas.drawCircle(500f, 100f, 100f, mPaint);
Paint.setStrokeWidth(float width)設(shè)置線條寬度
mPaint.setStrokeWidth(20f);
canvas.drawCircle(500f, 500f, 100f, mPaint);
canvas.drawRect 畫矩形
畫矩形有三種方法
- drawRect(RectF rect, Paint paint)
- drawRect(Rect rect, Paint paint)
- drawRect(float left, float top, float right, float bottom, Paint paint)
-
left,top,right,bottom:這4個參數(shù)的意思我在下圖中標(biāo)記出來
這里有朋友可能就要問了,Rect和RectF有什么區(qū)別秸妥?
簡單來說滚停,最大的不同就是精度不同,一個傳int類型粥惧,傳float類型键畴,至于其他的不同這里暫時先不說,也用不到突雪。
canvas.drawRect(200f,100f,400f,300f,paint);
等價于
RectF rectF = new RectF(200f,100f,400f,300f);
canvas.drawRect(rectF,paint);
canvas.drawPoint 畫點
canvas.drawPoint(float x, float y, Paint paint)
-
x,y:圓點的坐標(biāo)
-
點的大辛场:paint.setStrokeWidth(width)
-
點的形狀:paint.setStrokeCap(cap) ,ROUND圓形挂签,SQUARE或BUTT方形(默認(rèn))。
paint.setStrokeWidth(40);
paint.setStrokeCap(Paint.Cap.ROUND);
canvas.drawPoint(100f,100f,paint);
paint.setStrokeCap(Paint.Cap.BUTT);
canvas.drawPoint(600f,300f,paint);
canvas.drawPoints 批量畫點
批量畫點有兩種方法
- canvas.drawPoints(float[] pts, int offset, int count, Paint paint)
- canvas.drawPoints(float[] pts, Paint paint)
-
pts:點的坐標(biāo)數(shù)組
//繪制八個點(50,50)(100,50)(150,50)(200,50)
//(50,100)(100,100)(150,100)(200,100)
float[] pts = {50,50,100,50,150,50,200,50,50,100,100,100,150,100,200,100};
canvas.drawPoints(pts,paint);
-
offset:從數(shù)組中的第幾個index開始取
-
count:取幾個
舉個例子盼产,我們傳offset為2,count為4饵婆,再傳offset為1,count為4看看效果
顯然這兩個點的坐標(biāo)為(100戏售,50)和(150侨核,50)
這兩個點的坐標(biāo)為(50,100)和(50灌灾,150)
canvas.drawOval 畫橢圓
畫橢圓有兩種方法
- drawOval(RectF rect, Paint paint)
- drawOval(float left, float top, float right, float bottom, Paint paint)
canvas.drawOval(300f,300f,600f,450f,paint);
其實我們可以理解為下圖
當(dāng)然我們也可以使用Paint.setStyle(Paint.Style style)繪制出空心橢圓搓译,這里就不演示了,參考上面的drawRect()锋喜。
canvas.drawLine 畫線
canvas.drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
-
startX些己,startY:起始點的坐標(biāo)
-
stopX,stopY:結(jié)束點的坐標(biāo)
兩點確定一條直線嘿般。段标。。炉奴,當(dāng)然我們也可以使用paint.setStrokeWidth()改變線的寬度逼庞。
canvas.drawLine(100,100,400,100,paint);
paint.setStrokeWidth(10);
canvas.drawLine(100,300,400,300,paint);
canvas.drawLines 批量畫線
批量畫線有兩種方法
- canvas.drawLines(float[] pts, int offset, int count, Paint paint)
- canvas.drawLines(float[] pts, Paint paint)
這里的參數(shù)與上面畫點是一樣的。
//(50瞻赶,50)(150赛糟,50)(100派任,0)(100,150)(100璧南,50)(50掌逛,150)(100,50)(150穆咐,150)
float[] pts = {50,50,150,50,100,0,100,150,100,50,50,150,100,50,150,150};
canvas.drawLines(pts,paint);
本來想畫個李字的颤诀,想了想,點太多了对湃,畫個木字算了崖叫,哈哈哈,請原諒我懶拍柒。心傀。。
canvas.drawRoundRect 畫圓角矩形
-
rx,ry:圓角的橫向半徑和縱向半徑
畫圓角矩形有兩種方法
- drawRoundRect(RectF rect, float rx, float ry, Paint paint)
- drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint)
canvas.drawRoundRect(200f,300f,600f,500f,20f,20f,paint);
canvas.drawArc 繪制弧形或扇形
canvas.drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
-
left,top,right,bottom:還是用來確定繪制位置的
-
startAngle:起始角度
-
sweepAngle:劃過的角度
-
useCenter:是否連接到圓心
這里首先我們要確定一個概念拆讯,0度在哪里脂男,直接貼圖
RectF rectF = new RectF(300f,200f,500f,400f);
paint.setStyle(Paint.Style.FILL);//填充模式
canvas.drawArc(rectF, -110f, 100f, false, paint);//不連接圓心的填充弧形
canvas.drawArc(rectF,20f,140f,true,paint);//連接圓心的填充扇形
paint.setStyle(Paint.Style.STROKE);//鉤邊模式
canvas.drawArc(rectF,-160f,40f,false,paint);//不連接圓心的弧形
canvas.drawArc(rectF,170f,20f,true,paint);//連接圓心的扇形
canvas.drawBitmap 畫 Bitmap
canvas.drawBitmap(Bitmap bitmap, float left, float top, Paint paint)
canvas.drawBitmap(bitmap,20f,20f,paint);
canvas.drawText 繪制文字
canvas.drawText(String text, float x, float y, Paint paint)
paint.setTextSize(20);
canvas.drawText("LXT",50f,100f,paint);
paint.setTextSize(30);
canvas.drawText("LXT",50f,200f,paint);
paint.setTextSize(40);
canvas.drawText("LXT",50f,300f,paint);
paint.setTextSize(50);
canvas.drawText("LXT",50f,400f,paint);