一:Canvas.drawxxx()系列方法以及Paint常見使用
1:移動坐標系
canvas.translate(width/2,height/2); //可以將坐標系從左上角移動到指定位置
cavas.scale(1,-1);//反轉(zhuǎn)y坐標軸,反轉(zhuǎn)之后向上為正嗽仪,向下為負薪棒。
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);
}
使用的數(shù)組還是之前的數(shù)組易核,就是在drawPoints的參數(shù)上做了調(diào)整。該方法第二個參數(shù)表示從第幾個數(shù)組元素開始繪制浪默,由于數(shù)組的元素是兩個點構(gòu)成一個坐標牡直,因此偏移兩個位置,即一個點纳决。第三個參數(shù)表示一共使用幾個數(shù)組元素碰逸,在本段代碼中最后將原始數(shù)組進行了截取,相當于使用了下面這個新數(shù)組進行繪制阔加。
float [] pts={100,100,170,100,240,100};
如果我們將參數(shù)調(diào)整為
canvas.drawPoints(pts,1,7,paint);
將會顯示如下饵史,雖然取了7個元素,但是最后一個元素沒有配對的y坐標胜榔,無法繪制出來胳喷。
4:drawOval(float left, float top, float right, float bottom, @NonNull Paint paint);
前兩個參數(shù)可以認為是橢圓外切矩形的左上點坐標。
接下來的兩個參數(shù)可以認為是橢圓外切矩形的右下點坐標苗分。
5:畫線drawLine(float startX, float startY, float stopX, float stopY,@NonNull Paint paint)
我們通過代碼畫了三條線厌蔽,分別設(shè)置了不同的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);
}
但是從效果圖中纬向,我們看到的三條線的長度好像并不一致。從代碼中我們知道我們設(shè)置的起始點y坐標是30戴卜,但是只有第一條線滿足了逾条,后面兩條線不滿足,長度為600投剥,也只有第一條滿足了师脂,后面兩條未滿足。因為cap是指當畫筆畫完之后江锨,再給任務(wù)畫一個帽子吃警,這個帽子是多出來的。
和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有兩種方法氓英,一類是直接描述路徑侯勉,一類是輔助設(shè)置或計算
(1):addCircle/addOval/addArc/addRect/addRoundRect。
最后一個參數(shù)dir表示方向铝阐,有兩個選項址貌,一個是cr順時針,一個是ccr逆時針饰迹。
lineTo/rLineTo 前者是絕對坐標芳誓。后者是相對坐標。都是畫直線啊鸭。
使用path畫粗線的時候锹淌,比如直方圖的粗線,一定要把style設(shè)置為stroke赠制。
畫線的方向就是方向赂摆。
quadTo/rQuadTo 畫二次貝塞爾曲線。
cubicTo/rCubicTo 畫三次貝塞爾曲線
moveTo/rMoveTo 移動到目標位置開始畫起點
moveTo :移動到下一次操作的起點位置
setLastPoint 設(shè)置之前操作的最后一個點位置钟些。這會取消之前的終點位置烟号。如圖所示:
那么在3d旋轉(zhuǎn)的時候,能不能通過setLastPoint來旋轉(zhuǎn)一個點達到效果呢政恍?
重點
arcTo 只畫弧形不畫扇形汪拥。forceMoveTo參數(shù)表示是否留下畫筆的移動痕跡。
addArc()表示forceMoveTo=true的簡化版arcTo篙耗。
close()封閉當前圖形迫筑。終點到起點的連線宪赶。當畫筆為fill的時候,會自動封閉脯燃。
在畫心形的時候搂妻,不要抬筆,也就是不要將forceMoveTo設(shè)置為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):輔助設(shè)置或計算 Path.setFillType(Path.FillType ft)