本文學(xué)習(xí)資料 《android群英傳》
先上圖
學(xué)習(xí)內(nèi)容
(一)canvas.save()這個方法,保存畫布娇斩;
(二)canvas.restore();合并圖層窗轩,他的作用是在
sava()之后繪制的所有圖片給與save()之前的圖像進(jìn)行合并。
(三)Cavas.rotate();把畫布進(jìn)行旋轉(zhuǎn)敦第,只需要計算好旋轉(zhuǎn)角度争群,就可以實現(xiàn)許多復(fù)雜的繪圖
首先繪制圓盤
Paint paint1=new Paint();
paint1.setStyle(Paint.Style.STROKE);
paint1.setTextSize(25);
canvas.drawCircle(mwidth/2,mheight/2,mwidth/2,paint1);
表盤的重點在繪制刻度 ,這里用到的rotate()方法回怜,用于旋轉(zhuǎn)畫布,因為第一次的數(shù)字是1换薄,所以先進(jìn)行旋轉(zhuǎn)360/60=6度玉雾,繪制60次,小刻度就出來了轻要。然后進(jìn)行
for(int i=1;i<13;i++){
//十二個刻度
String s=String.valueOf(i);
canvas.rotate(30,mwidth/2,mheight/2);
canvas.drawLine(mwidth/2,mheight/2-mwidth/2,mwidth/2,mheight/2-mwidth/2+100,paint1);
canvas.drawText(s,mwidth/2-paint.measureText(s)/2,mheight/2-mwidth/2+150,paint1);
}
for(int i=1;i<61;i++){
//六十個小刻度
canvas.rotate(6,mwidth/2,mheight/2);
canvas.drawLine(mwidth/2,mheight/2-mwidth/2,mwidth/2,mheight/2-mwidth/2+50,paint1)复旬; } ```
最后繪制時針,分針冲泥,秒針(主要在計算每次旋轉(zhuǎn)的角度上)
因為畫布旋轉(zhuǎn)的角度在上次的基礎(chǔ)上進(jìn)行的驹碍,所以通過:
h=小時*30
m=分鐘*6壁涎;
s=秒*6;
計算出來的都是初始時畫布應(yīng)該旋轉(zhuǎn)的角度志秃,但是當(dāng)分針已經(jīng)旋轉(zhuǎn)了m度怔球,那么秒針旋轉(zhuǎn)的角度必須減去m,否則就會出現(xiàn)分針動浮还,時針和秒針都旋轉(zhuǎn)竟坛。
private void drawPointer(Canvas canvas) {
Calendar calendar=Calendar.getInstance();
Date date=calendar.getTime();
int hour= date.getHours();
int minute=date.getMinutes();
int second=date.getSeconds();
int degree=second6;
int hourdegree=hour30;
int minutedegree=minute*6;
int mwidth=getWidth();
int mheight=getHeight();
// System.out.println("小時"+hour+"分鐘"+minute+"秒"+second);
Paint paint1=new Paint();
paint1.setStrokeWidth(35);
canvas.rotate(hourdegree,mwidth/2,mheight/2);
canvas.drawLine(mwidth/2,mheight/2,mwidth/2,mheight/2-mwidth/4,paint1);
canvas.save();
canvas.restore();
Paint paint2=new Paint();
paint2.setStrokeWidth(20);
paint2.setStyle(Paint.Style.STROKE);
canvas.rotate(minutedegree-hourdegree,mwidth/2,mheight/2);
canvas.drawLine(mwidth/2,mheight/2,mwidth/2,mheight/2-mwidth/3,paint2);
canvas.save();
canvas.restore();
Paint paint=new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(20);
paint.setColor(Color.BLUE);
canvas.rotate(degree-minutedegree,mwidth/2,mheight/2);
canvas.drawLine(mwidth/2,mheight/2,mwidth/2,mheight/2-mwidth/2,paint);
canvas.save();
canvas.restore();
}
最后在onDraw方法中調(diào)用drawPointer,需要通知更新钧舌,這里我設(shè)置更新的時間為300ms
drawPointer(canvas);
postInvalidateDelayed(300);
invalidate();
本人如有錯誤担汤,歡迎留言