上一篇,咱們說了繪製基本的幾何圖形,這一篇咱們說說繪製路徑(Path)java
這裏主要用到的方法是 canvas.drawPath(path, paint);
canvas
主要用到的方法spa
moveTo(float x, float y)
起始點3d
lineTo(float x, float y)
當前點直線的結束點,也是下條直線的起始點code
close()
閉合cdn
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStrokeWidth(10);
paint.setStyle(Paint.Style.FILL);
Path path = new Path();
path.moveTo(20, 20); //設定起始點
path.lineTo(300, 100);//第1條直線
path.lineTo(300, 300);//第2條直線
path.close();//閉合
canvas.drawPath(path, paint);
複製代碼
addRect(RectF rect, Direction dir)
blog
addRect(float left, float top, float right, float bottom, Direction dir)
get
RectF
和float left, float top, float right, float bottom
是同樣的,Direction
有2種方式,CW
和CCW
,其中CW
表示順時針,CCW
表示逆時針博客
Path ccw = new Path();
RectF rect1 = new RectF(50, 50, 300, 300);
ccw.addRect(rect1, Path.Direction.CCW);//逆時針
Path cw = new Path();
RectF rect2 = new RectF(350, 50, 600, 300);
cw.addRect(rect2, Path.Direction.CW);//順時針
canvas.drawPath(ccw, paint);
canvas.drawPath(cw, paint);
複製代碼
看上去好像是同樣的?實際上是過程不同,結果同樣,細節的話,咱們後面再說。
addRoundRect(RectF rect, float rx, float ry, Direction dir)
string
addRoundRect(float left, float top, float right, float bottom, float rx, float ry, Direction dir)
addRoundRect(RectF rect, float[] radii, Direction dir)
addRoundRect(float left, float top, float right, float bottom, float[] radii,Direction dir)
其中,radii
只能傳入8個數值,多於8個不會有效果,rx
表示x方向的半徑,ry
表示y方向的半徑
Path ccw = new Path();
RectF rect1 = new RectF(50, 50, 500, 500);
float[] radii = {5, 20, 50, 100, 150, 200, 250, 300};
ccw.addRoundRect(rect1, radii, Path.Direction.CCW);
Path cw = new Path();
RectF rect2 = new RectF(550, 50, 1000, 500);
cw.addRoundRect(rect2, 10, 100, Path.Direction.CCW);
canvas.drawPath(ccw, paint);
paint.setColor(Color.BLUE);
canvas.drawPath(cw, paint);
複製代碼
addCircle(float x, float y, float radius, Direction dir)
Path cw = new Path();
cw.addCircle(200, 200, 100, Path.Direction.CW);
canvas.drawPath(cw, paint);
複製代碼
addOval(RectF oval, Direction dir)
addOval(float left, float top, float right, float bottom, Direction dir)
Path cw = new Path();
RectF rect1 = new RectF(50, 50, 500, 300);
cw.addOval(rect1, Path.Direction.CW);
canvas.drawPath(cw, paint);
複製代碼
addArc(RectF oval, float startAngle, float sweepAngle)
addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle)
startAngle
開始的角度,X軸正方向爲0度
sweepAngel
持續的度數
Path cw = new Path();
RectF rect1 = new RectF(50, 50, 500, 300);
cw.addArc(rect1, 0, 180);
canvas.drawPath(cw, paint);
複製代碼
drawTextOnPath(String text, Path path, float hOffset,float vOffset, Paint paint)
drawTextOnPath(char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)
index
表示開始位置
count
表示結束位置,能夠對文字進行截取
hOffset
表示繪製位置離開始位置的偏移量
vOffset
表示繪製位置離開路徑的偏移量
String text = "ABCDEFGHIJKLMNOPQRSTYVWXYZ";
paint.setTextSize(72);
Path ccw = new Path();
RectF rect1 = new RectF(50, 50, 500, 500);
ccw.addRect(rect1, Path.Direction.CCW);//逆時針
Path cw = new Path();
RectF rect2 = new RectF(650, 50, 1100, 500);
cw.addRect(rect2, Path.Direction.CW);//順時針
canvas.drawPath(ccw, paint);
canvas.drawPath(cw, paint);
canvas.drawTextOnPath(text, ccw, 0, 0, paint);
canvas.drawTextOnPath(text, cw, 0, 0, paint);
複製代碼
這裏就能夠明顯的看出
CCW
和
CW
的區別了
修改hOffset
和vOffset
String text = "ABCDEFGHIJKLMNOPQRSTYVWXYZ";
paint.setTextSize(72);
Path ccw = new Path();
RectF rect1 = new RectF(50, 50, 500, 500);
ccw.addRect(rect1, Path.Direction.CCW);//逆時針
Path cw = new Path();
RectF rect2 = new RectF(650, 50, 1100, 500);
cw.addRect(rect2, Path.Direction.CW);//順時針
canvas.drawPath(ccw, paint);
canvas.drawPath(cw, paint);
canvas.drawTextOnPath(text, ccw, 100, 0, paint);
canvas.drawTextOnPath(text, cw, 0, 100, paint);
複製代碼
能夠看到,hOffset
表示繪製位置離開始位置的偏移量,vOffset
表示繪製位置離開路徑的偏移量,vOffset
越大,離圓心越近。