自绘View(时钟)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35189116/article/details/72673888
public class ClockView extends View {

//绘制表盘的画笔
private Paint circlePaint;
//绘制表盘圆心的画笔
private Paint dotPaint;

//绘制表盘上竖线的画笔
private Paint linePaint;

//绘制表盘文本的画笔
private Paint textPaint;

private Paint hourPaint;
private Paint minPaint;
private Paint secPaint;

private Calendar calendar;

//new一个控件时调用
public ClockView(Context context) {
this(context, null);
}

//在xml文件中定义控件,则会调用这个方法
public ClockView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

//该方法一般由系统调用,调用时给View设置了默认风格属性
public ClockView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);

circlePaint = new Paint();
//设置画笔的颜色
circlePaint.setColor(Color.GREEN);
//设置画笔风格为描边
circlePaint.setStyle(Paint.Style.STROKE);
//设置画笔宽度
circlePaint.setStrokeWidth(4);
//去锯齿
circlePaint.setAntiAlias(true);

dotPaint = new Paint();
dotPaint.setColor(Color.RED);
dotPaint.setStyle(Paint.Style.FILL);
dotPaint.setAntiAlias(true);

linePaint = new Paint();
linePaint.setColor(Color.GREEN);
linePaint.setAntiAlias(true);
linePaint.setStrokeWidth(4);

textPaint = new Paint();
textPaint.setAntiAlias(true);
textPaint.setTextSize(18);
textPaint.setColor(Color.RED);
textPaint.setTextAlign(Paint.Align.CENTER);

hourPaint = new Paint();
hourPaint.setColor(Color.BLUE);
hourPaint.setStrokeWidth(6);
hourPaint.setAntiAlias(true);

minPaint = new Paint();
minPaint.setColor(Color.GREEN);
minPaint.setStrokeWidth(3);

secPaint = new Paint();
secPaint.setColor(Color.RED);
secPaint.setStrokeWidth(1);

calendar = Calendar.getInstance();
}

//绘制控件
// super.onDraw(canvas);,自绘View中删与不删都行,继承现有控件增强其功能时不可以删除
@Override
protected void onDraw(Canvas canvas) {
//获取控件的宽高
int width = getWidth();
int height = getHeight();
int radius = width / 2;
canvas.drawCircle(width / 2, height / 2, radius - 2, circlePaint);
canvas.drawCircle(radius, radius, 20, dotPaint);
for (int i = 1; i < 13; i++) {
//画布旋转之前,先将画布上已经画好的东西保存下来
canvas.save();
//第一个参数表示旋转度数
//第二三个参数表示旋转中心点
canvas.rotate(i * 30, radius, radius);
canvas.drawLine(width / 2, 3, width / 2, 13, linePaint);
//1.要绘制的文本
//2.文本的X轴中心点,如果在画笔中没有设置setTextAlign属性,则该参数表示文本的起始位置
//3.文本的基线
//4.画笔
canvas.drawText(i + "", width / 2, 35, textPaint);
//画布旋转角度复原
canvas.restore();
}

calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
canvas.save();
canvas.rotate(hour * 30 + minute / 2, radius, radius);
canvas.drawLine(width / 2, height / 2 + 40, width / 2, 100, hourPaint);
canvas.restore();

canvas.save();
canvas.rotate(minute * 6, radius, radius);
canvas.drawLine(width / 2, height / 2 + 45, width / 2, 80, minPaint);
canvas.restore();
int second = calendar.get(Calendar.SECOND);

canvas.save();
canvas.rotate(second * 6, radius, radius);
canvas.drawLine(width / 2, height / 2 + 50, width / 2, 60, secPaint);
canvas.restore();

postInvalidateDelayed(1000);
}

}

好了现在把它放到XML里面就可以了,大家都来试试吧

猜你喜欢

转载自blog.csdn.net/qq_35189116/article/details/72673888