一:Canvas.drawxxx()系列方法以及Paint常見使用
1:移動坐標系
canvas.translate(width/2,height/2); //可以將坐標系從左上角移動到指定位置
cavas.scale(1,-1);//反轉y坐標軸,反轉之后向上為正,向下為負。
2:drawRect(float left, float top, float right, float bottom, Paint paint)
畫矩形傳入的是左上點和右下點的坐標。drawRect(左上x,左上y,右下x,右下y,paint);
3:drawPoint(float x, float y, Paint paint)
在畫點的時候,需要paint.setStrokeWidth();不然點看不到。
(1):畫多個點
float [] pts={30,100,100,100,170,100,240,100,310,100};
private void init() {
paint=new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.parseColor("#2bb8ed"));
paint.setStrokeWidth(50);
paint.setStrokeCap(Paint.Cap.ROUND);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawPoints(pts,paint);
// canvas.drawPoints(pts,2,6,paint);
}
(2):畫多個點同時偏移
float [] pts={30,100,100,100,170,100,240,100,310,100};
private void init() {
paint=new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.parseColor("#2bb8ed"));
paint.setStrokeWidth(50);
paint.setStrokeCap(Paint.Cap.ROUND);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// canvas.drawPoints(pts,paint);
canvas.drawPoints(pts,2,6,paint);
}
使用的數組還是之前的數組,就是在drawPoints的參數上做了調整。該方法第二個參數表示從第幾個數組元素開始繪制,由于數組的元素是兩個點構成一個坐標,因此偏移兩個位置,即一個點。第三個參數表示一共使用幾個數組元素,在本段代碼中最后將原始數組進行了截取,相當于使用了下面這個新數組進行繪制。
float [] pts={100,100,170,100,240,100};
如果我們將參數調整為
canvas.drawPoints(pts,1,7,paint);
將會顯示如下,雖然取了7個元素,但是最后一個元素沒有配對的y坐標,無法繪制出來。
4:drawOval(float left, float top, float right, float bottom, @NonNull Paint paint);
前兩個參數可以認為是橢圓外切矩形的左上點坐標。
接下來的兩個參數可以認為是橢圓外切矩形的右下點坐標。
5:畫線drawLine(float startX, float startY, float stopX, float stopY,@NonNull Paint paint)
我們通過代碼畫了三條線,分別設置了不同的Cap,三條線除了顏色不一樣和cap不一樣之外,其他的都一致。
private void init() {
paint=new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.RED);
paint.setStrokeWidth(50);
paint.setStrokeCap(Paint.Cap.BUTT);
paint1=new Paint(Paint.ANTI_ALIAS_FLAG);
paint1.setColor(Color.GRAY);
paint1.setStrokeWidth(50);
paint1.setStrokeCap(Paint.Cap.ROUND);
paint2=new Paint(Paint.ANTI_ALIAS_FLAG);
paint2.setColor(Color.BLUE);
paint2.setStrokeWidth(50);
paint2.setStrokeCap(Paint.Cap.SQUARE);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawLine(30,30,30,630,paint);
canvas.drawLine(130,30,130,630,paint1);
canvas.drawLine(230,30,230,630,paint2);
}
但是從效果圖中,我們看到的三條線的長度好像并不一致。從代碼中我們知道我們設置的起始點y坐標是30,但是只有第一條線滿足了,后面兩條線不滿足,長度為600,也只有第一條滿足了,后面兩條未滿足。因為cap是指當畫筆畫完之后,再給任務畫一個帽子,這個帽子是多出來的。
和cap類似的還有一個join
public enum Join {
/**
* The outer edges of a join meet at a sharp angle
*/
MITER (0),
/**
* The outer edges of a join meet in a circular arc.
*/
ROUND (1),
/**
* The outer edges of a join meet with a straight line
*/
BEVEL (2);
private Join(int nativeInt) {
this.nativeInt = nativeInt;
}
final int nativeInt;
}
6:drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint)
圓角矩形
7:drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
扇形或者弧形或者弧線。是否填充全在于paint.setStyle(Paint.Style.);
三點鐘方向為0度。
順時針為正方向。
useCenter表示在兩邊是否用線連接到圓心。如果連接就是弧形,不連接就是扇形。
private void init() {
paint=new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.RED);
paint.setStrokeWidth(10);
paint.setStrokeCap(Paint.Cap.BUTT);
paint.setStyle(Paint.Style.STROKE);
paint1=new Paint(Paint.ANTI_ALIAS_FLAG);
paint1.setColor(Color.GRAY);
paint1.setStrokeWidth(50);
paint1.setStrokeCap(Paint.Cap.ROUND);
paint2=new Paint(Paint.ANTI_ALIAS_FLAG);
paint2.setColor(Color.BLUE);
paint2.setStrokeWidth(10);
paint2.setStrokeCap(Paint.Cap.SQUARE);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawArc(0, 0, 200, 200, 50, 100, false, paint);
canvas.drawArc(0, 200, 300, 400, -360, 100, true, paint);
canvas.drawArc(0, 500, 400, 700, -150, 100, false, paint1);
canvas.drawArc(400, 500, 500, 600, -150, 100, true, paint1);
}
8:drawPath
path有兩種方法,一類是直接描述路徑,一類是輔助設置或計算
(1):addCircle/addOval/addArc/addRect/addRoundRect。
最后一個參數dir表示方向,有兩個選項,一個是cr順時針,一個是ccr逆時針。
lineTo/rLineTo 前者是絕對坐標。后者是相對坐標。都是畫直線。
使用path畫粗線的時候,比如直方圖的粗線,一定要把style設置為stroke。
畫線的方向就是方向。
quadTo/rQuadTo 畫二次貝塞爾曲線。
cubicTo/rCubicTo 畫三次貝塞爾曲線
moveTo/rMoveTo 移動到目標位置開始畫起點
moveTo :移動到下一次操作的起點位置
setLastPoint 設置之前操作的最后一個點位置。這會取消之前的終點位置。如圖所示:
那么在3d旋轉的時候,能不能通過setLastPoint來旋轉一個點達到效果呢?
重點
arcTo 只畫弧形不畫扇形。forceMoveTo參數表示是否留下畫筆的移動痕跡。
addArc()表示forceMoveTo=true的簡化版arcTo。
close()封閉當前圖形。終點到起點的連線。當畫筆為fill的時候,會自動封閉。
在畫心形的時候,不要抬筆,也就是不要將forceMoveTo設置為true,因為true就以為著是一個新的If true, always begin a new contour with the arc。那么在封閉的時候,只能封閉當前的contour,而不能封閉之前的contour了。
path.arcTo(200,100,400,300,150, 210,false);
path.arcTo(400,100,600,300,180, 210,false);
path.lineTo(400, 442);
(2):輔助設置或計算 Path.setFillType(Path.FillType ft)