ClockView.java
package com.example.xinxing;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import java.text.SimpleDateFormat;
import java.util.Calendar;public class ClockView extends View {private Paint paint;private int centerX, centerY, radius;private Calendar calendar;public ClockView(Context context, AttributeSet attrs) {super(context, attrs);paint = new Paint(Paint.ANTI_ALIAS_FLAG); // 抗锯齿calendar = Calendar.getInstance();startClock();}private void startClock() {postDelayed(new Runnable() {@Overridepublic void run() {invalidate(); // 重新绘制startClock(); // 循环调用}}, 1000); // 每秒更新}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);centerX = getWidth() / 2;centerY = getHeight() / 2;radius = Math.min(centerX, centerY) - 50;drawDial(canvas);drawScale(canvas);drawHands(canvas);drawDigitalTime(canvas); // 绘制数字时钟}private void drawDial(Canvas canvas) {paint.setColor(Color.GRAY);paint.setStrokeWidth(8);paint.setStyle(Paint.Style.STROKE);canvas.drawCircle(centerX, centerY, radius, paint);}private void drawScale(Canvas canvas) {paint.setStrokeWidth(8); // 大刻度的线宽// 绘制大刻度(每10分钟)for (int i = 0; i < 60; i++) {double angle = Math.toRadians(i * 6);float startX = (float) (centerX + radius * 0.85 * Math.sin(angle));float startY = (float) (centerY - radius * 0.85 * Math.cos(angle));float stopX = (float) (centerX + radius * 0.95 * Math.sin(angle));float stopY = (float) (centerY - radius * 0.95 * Math.cos(angle));if (i % 5 == 0) { // 长刻度paint.setColor(Color.BLACK);paint.setStrokeWidth(8);canvas.drawLine(startX, startY, stopX, stopY, paint);// 调整数字位置float textX = (float) (centerX + radius * 0.75 * Math.sin(angle)); // 调整坐标,靠近外圈float textY = (float) (centerY - radius * 0.75 * Math.cos(angle)) + 20; // 微调,使数字居中// 计算显示的数字int number = (i / 5) +12; // 原来的 1显示12加12显示正确if (number > 12) {number -= 12;}// 绘制黑色描边文本paint.setColor(Color.BLACK);paint.setStyle(Paint.Style.FILL);paint.setFakeBoldText(true); // 加粗paint.setTextSize(50); // 增大字体大小canvas.drawText(String.valueOf(number), textX, textY, paint);// 绘制白色文本paint.setColor(Color.WHITE);paint.setTextSize(45); // 增大字体大小paint.setFakeBoldText(false); // 恢复正常canvas.drawText(String.valueOf(number), textX, textY, paint);} else { // 短刻度paint.setColor(Color.GRAY); // 其他短刻度为灰色paint.setStrokeWidth(4);canvas.drawLine(startX, startY, stopX, stopY, paint);}}}private void drawHands(Canvas canvas) {calendar.setTimeInMillis(System.currentTimeMillis());// Draw hour handfloat hour = calendar.get(Calendar.HOUR_OF_DAY); // 使用HOUR_OF_DAY以获得24小时制float minute = calendar.get(Calendar.MINUTE);float hourAngle = ((hour % 12) + minute / 60.0f) * 30; // 360 / 12drawHand(canvas, hourAngle, radius * 0.5f, Color.BLACK);// Draw minute handfloat minuteAngle = minute * 6; // 360 / 60drawHand(canvas, minuteAngle, radius * 0.7f, Color.BLUE);// Draw second handfloat second = calendar.get(Calendar.SECOND);float secondAngle = second * 6; // 360 / 60drawHand(canvas, secondAngle, radius * 0.9f, Color.RED);}private void drawHand(Canvas canvas, float angle, float length, int color) {paint.setColor(color);paint.setStrokeWidth(8);paint.setStyle(Paint.Style.FILL);float x = (float) (centerX + length * Math.sin(Math.toRadians(angle)));float y = (float) (centerY - length * Math.cos(Math.toRadians(angle)));canvas.drawLine(centerX, centerY, x, y, paint);}private void drawDigitalTime(Canvas canvas) {// 获取当前时间calendar.setTimeInMillis(System.currentTimeMillis());SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");String timeText = sdf.format(calendar.getTime());// 设置字体paint.setColor(Color.GRAY);paint.setTextSize(100);paint.setTextAlign(Paint.Align.CENTER);// 绘制时间文字canvas.drawText(timeText, centerX, centerY + 30, paint);}
}
main
package com.example.xinxing;import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}
xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/shootingstar"><com.example.xinxing.ClockViewandroid:id="@+id/heartView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center" /></FrameLayout>