自定义ClockView
效果图:
自定义View
public class ClockView extends View {
private float cx;
private float cy;
private int radius;
private Paint paint;
public ClockView(Context context) {
this(context, null);
}
public ClockView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ClockView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 对View进行绘制
* @param canvas 画布对象
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//初始化参数
cx = getWidth() / 2f;
cy = getHeight() / 2f;
radius = Math.min(getWidth(), getHeight()) / 2 - 10;
paint = new Paint();
//绘制表盘
paint.setColor(Color.BLACK);//画笔的颜色
paint.setStrokeWidth(5);//画笔粗细
paint.setStyle(Paint.Style.STROKE);//空心画笔
canvas.drawCircle(cx, cy, radius, paint);
//绘制圆心
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.RED);
canvas.drawCircle(cx, cy, radius / 10, paint);
//拿到当前时间
int hour = Calendar.getInstance().get(Calendar.HOUR);
int minute = Calendar.getInstance().get(Calendar.MINUTE);
int second = Calendar.getInstance().get(Calendar.SECOND);
float fhour = Calendar.getInstance().get(Calendar.HOUR) + minute / 60f;
//绘制指针
paint.setStrokeWidth(20);
paint.setColor(Color.RED);
paint.setStrokeCap(Paint.Cap.ROUND);
canvas.drawLine(cx, cy, (float) (cx + radius * 0.5 * Math.sin(Math.toRadians(fhour * 30))),
(float) (cy - (radius * 0.5 * Math.cos(Math.toRadians(fhour * 30)))), paint);
paint.setStrokeWidth(10);
paint.setColor(Color.BLUE);
canvas.drawLine(cx, cy, (float) (cx + radius * 0.6 * Math.sin(Math.toRadians(minute * 6))),
(float) (cy - (radius * 0.6 * Math.cos(Math.toRadians(minute * 6)))), paint);
paint.setStrokeWidth(5);
paint.setColor(Color.GREEN);
canvas.drawLine(cx, cy, (float) (cx + radius * 0.7 * Math.sin(Math.toRadians(second * 6))),
(float) (cy - (radius * 0.7 * Math.cos(Math.toRadians(second * 6)))), paint);
//绘制数字
paint.setTextSize(50);
paint.setColor(Color.BLACK);
for (int i = 1; i < 13; i++) {
float tx = paint.measureText(i + "") / 2;
canvas.drawText(i + "", (float) (cx + radius * 0.85 * Math.sin(Math.toRadians(i * 30))) - tx,
(float) (cy - (radius * 0.85 * Math.cos(Math.toRadians(i * 30)))) + 20, paint);
}
//每秒刷新一次
postInvalidateDelayed(1000);//1000毫秒后调onDraw()刷新自己
}
}