Android Canvas 画一个钟表
时间: 2024-06-03 18:07:16 浏览: 17
以下是一个简单的Android Canvas绘制钟表的示例代码:
```java
public class MyClockView extends View {
private Paint mCirclePaint;
private Paint mLinePaint;
private Paint mTextPaint;
private Paint mHourHandPaint;
private Paint mMinuteHandPaint;
private Paint mSecondHandPaint;
private float mHour;
private float mMinute;
private float mSecond;
public MyClockView(Context context) {
super(context);
init();
}
public MyClockView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyClockView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mCirclePaint = new Paint();
mCirclePaint.setAntiAlias(true);
mCirclePaint.setStyle(Paint.Style.STROKE);
mCirclePaint.setStrokeWidth(5);
mCirclePaint.setColor(Color.BLACK);
mLinePaint = new Paint();
mLinePaint.setAntiAlias(true);
mLinePaint.setStyle(Paint.Style.STROKE);
mLinePaint.setStrokeWidth(3);
mLinePaint.setColor(Color.BLACK);
mTextPaint = new Paint();
mTextPaint.setAntiAlias(true);
mTextPaint.setStyle(Paint.Style.FILL);
mTextPaint.setTextSize(30);
mTextPaint.setColor(Color.BLACK);
mHourHandPaint = new Paint();
mHourHandPaint.setAntiAlias(true);
mHourHandPaint.setStyle(Paint.Style.STROKE);
mHourHandPaint.setStrokeWidth(8);
mHourHandPaint.setColor(Color.BLACK);
mMinuteHandPaint = new Paint();
mMinuteHandPaint.setAntiAlias(true);
mMinuteHandPaint.setStyle(Paint.Style.STROKE);
mMinuteHandPaint.setStrokeWidth(5);
mMinuteHandPaint.setColor(Color.BLACK);
mSecondHandPaint = new Paint();
mSecondHandPaint.setAntiAlias(true);
mSecondHandPaint.setStyle(Paint.Style.STROKE);
mSecondHandPaint.setStrokeWidth(3);
mSecondHandPaint.setColor(Color.RED);
// 获取当前时间
Calendar calendar = Calendar.getInstance();
mHour = calendar.get(Calendar.HOUR_OF_DAY);
mMinute = calendar.get(Calendar.MINUTE);
mSecond = calendar.get(Calendar.SECOND);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 获取控件宽高
int width = getWidth();
int height = getHeight();
// 计算圆的半径
int radius = Math.min(width, height) / 2 - 10;
// 画圆
canvas.drawCircle(width / 2, height / 2, radius, mCirclePaint);
// 画刻度线和数字
for (int i = 0; i < 12; i++) {
canvas.save();
canvas.translate(width / 2, height / 2);
canvas.rotate(i * 30);
canvas.drawLine(0, -radius, 0, -radius + 30, mLinePaint);
canvas.drawText(String.valueOf(i + 1), -10, -radius + 60, mTextPaint);
canvas.restore();
}
// 画时针
canvas.save();
canvas.translate(width / 2, height / 2);
canvas.rotate(mHour * 30 + mMinute / 2);
canvas.drawLine(0, 0, 0, -radius / 2, mHourHandPaint);
canvas.restore();
// 画分针
canvas.save();
canvas.translate(width / 2, height / 2);
canvas.rotate(mMinute * 6);
canvas.drawLine(0, 0, 0, -radius * 3 / 4, mMinuteHandPaint);
canvas.restore();
// 画秒针
canvas.save();
canvas.translate(width / 2, height / 2);
canvas.rotate(mSecond * 6);
canvas.drawLine(0, 0, 0, -radius + 20, mSecondHandPaint);
canvas.restore();
// 刷新时间
postInvalidateDelayed(1000);
}
}
```
在xml布局文件中添加MyClockView:
```xml
<com.example.myapp.MyClockView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
```
运行效果如下图所示:
![image](https://user-images.githubusercontent.com/543384/136059427-20c4b3c3-e3c8-4e2d-b0d1-7e5bfc8b9d11.png)
相关推荐
![js](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)