這回來畫餅形圖,進(jìn)一步屬性API調(diào)用
在此之前桂敛,先理清楚Canvas的坐標(biāo)系功炮,在Android里,Canvas就相當(dāng)于一個(gè)畫布术唬,而屏幕則是一個(gè)窗口薪伏,窗口移動(dòng)到畫布上的部分,就是我們能夠看到的部分粗仓。
先看個(gè)圖:
Canvas坐標(biāo)系
圖上已經(jīng)很明顯了嫁怀,Canvas是一塊畫布,而屏幕(理解為View更合適)這是可以移動(dòng)的顯示部分借浊,而默認(rèn)Canvas的原點(diǎn)是屏幕的左上角塘淑。
基于這些,再介紹下Canvas的坐標(biāo)移動(dòng)蚂斤,就拿canvas.translate()來舉例存捺,如果canvas.translate(100,100)就是移動(dòng)Canvas的X曙蒸、Y軸100個(gè)像素捌治,具體如圖:
Canvas.translate()
從圖上可以清晰看出岗钩,Canvas移動(dòng)后,坐標(biāo)原點(diǎn)已經(jīng)不在屏幕左上角了肖油,所以凹嘲,現(xiàn)在的canvas使用的坐標(biāo),在屏幕上的位置(x,y)构韵,相對于之前的(x0+100,y0+100),在屏幕上顯示的位置都默認(rèn)加100趋艘。
進(jìn)入正題疲恢,看如何畫餅圖:
public class PieChart extends View {
private final static float RADIUS = UiUtils.dpToPixel(150);
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
private final static float POINT_LEN = UiUtils.dpToPixel(5);
private RectF bounds = new RectF();
private int[] angles = {60, 100, 120, 80};
private int[] colors = {Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW};
public PieChart(Context context, @Nullable AttributeSet attrs) {
// 給系統(tǒng)使用的
super(context, attrs);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// 確定橢圓的范圍
bounds.set(getWidth() / 2 - RADIUS, getHeight() / 2 - RADIUS, getWidth() / 2 + RADIUS, getHeight() / 2 + RADIUS);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int currentArgs = 0;
for (int i = 0; i < angles.length; i++) {
paint.setColor(colors[i]);
canvas.save();
// 對canvas進(jìn)行一定的偏移
// 以具體的角的中點(diǎn),向外偏移一小段距離
// 注意:sin和cos的值都是小于1的瓷胧,千萬不要強(qiáng)行轉(zhuǎn)換為int显拳,會(huì)把計(jì)算的結(jié)果全部抹掉
canvas.translate((float) Math.cos(Math.toRadians(currentArgs + angles[i]/2))*POINT_LEN,
(float) Math.sin(Math.toRadians(currentArgs + angles[i]/2))*POINT_LEN);
canvas.drawArc(bounds, currentArgs, angles[i], true, paint);
canvas.restore();
currentArgs += angles[i];
}
}
}
主要地方都加上了注釋,現(xiàn)在看下效果圖:
餅形圖