今天閑來沒事,自己實作了一個android自定義view(實作時鐘顯示)的功能,先看下效果:
這裡為了友善,一些自定義的屬性,我就沒有使用,都是在代碼裡面寫的,算是一個記錄。
public class PathView extends View {
private Path mPath = null;
private Paint mPaint = null;
private static int HOUR = 0;
private static int MINUTE = 0;
private static int SECOND = 0;
final Calendar mCalendar=Calendar.getInstance();
private String[] times = new String[3];
public PathView(Context context, AttributeSet attrs) {
super(context, attrs);
mPath = new Path();
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(Color.parseColor("#f90876"));
mPaint.setStrokeWidth(2);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setTextSize(30.0f);
// 啟動每間隔一秒重新整理一次界面
Timer timer=new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
postInvalidate();
}
},0,1000);
}
public PathView(Context context) {
this(context,null);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//擷取到目前view的寬和高
int width = getWidth();
int height = getHeight();
mPaint.setColor(Color.parseColor("#f90876"));
mPaint.setStrokeWidth(2);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setTextSize(30.0f);
// 畫表盤
canvas.drawCircle(width/2,height/2,300,mPaint);
// 表心,一個點
mPaint.setStrokeCap(Paint.Cap.ROUND);
canvas.drawPoint(width/2,height/2,mPaint);
// 儲存畫布
canvas.save();
// 首先旋轉30度,保證第一個繪制在30度的位置,和數字保持一緻
canvas.rotate(30,width/2,height/2);
// 繪制時針刻度
for (int i=1; i< 13; i++) {
canvas.drawLine(width/2,height/2-300,width/2,height/2-300+40,mPaint);
canvas.drawText(""+i,width/2 -10,height/2-300+50,mPaint);
// canvas預設旋轉中心為左上角,可以調用這個方法,後面兩個參數是旋轉中心的坐标
canvas.rotate(30,width/2,height/2);
}
// 繪制分針刻度
for (int j=1; j< 13; j++) {
for (int k = 1; k < 4; k++) {
mPaint.setColor(Color.BLUE);
canvas.rotate(360/48f,width/2,height/2);
canvas.drawLine(width/2,height/2-300,width/2,height/2-300+20,mPaint);
}
canvas.rotate(360/48f,width/2,height/2);
}
canvas.restore();
Calendar mCalendar=Calendar.getInstance();
HOUR = mCalendar.get(Calendar.HOUR);
MINUTE = mCalendar.get(Calendar.MINUTE);
SECOND = mCalendar.get(Calendar.SECOND);
canvas.save();
mPaint.setStrokeWidth(8);
mPaint.setColor(Color.GREEN);
canvas.rotate(360/12f*HOUR + (MINUTE / 60f * 30),width/2,height/2);
canvas.drawLine(width/2,height/2,width/2,height/2-300+150,mPaint);
canvas.restore();
canvas.save();
mPaint.setStrokeWidth(8);
mPaint.setColor(Color.RED);
canvas.rotate(MINUTE / 60f * 360 + SECOND / 60 * 6,width/2,height/2);
canvas.drawLine(width/2,height/2,width/2,height/2-300+100,mPaint);
canvas.restore();
canvas.save();
mPaint.setStrokeWidth(4);
mPaint.setColor(Color.YELLOW);
canvas.rotate(SECOND * 6,width/2,height/2);
canvas.drawLine(width/2,height/2,width/2,height/2-300+80,mPaint);
canvas.restore();
}
}
歡 迎 關 注 我 的 公 衆 号 “編 程 大 全”
專注技術分享,包括Java,python,AI人工智能,Android分享,不定期更新學習視訊