返回
HarmonyOS 使用 Canvas 绘制时钟:简单、精确、高效
前端
2024-01-04 09:25:16
好的,根据你的要求,我将生成一篇关于“鸿蒙--canvas 画时钟”的文章。
如今,智能设备已成为人们生活中不可或缺的一部分,而作为智能设备操作系统中最为重要的部分之一,UI 设计尤为关键。HarmonyOS 作为一款备受瞩目的操作系统,其 UI 设计一直备受好评,而 Canvas 作为 HarmonyOS 中一项重要的绘图技术,更是备受开发者青睐。
在本文中,我们将介绍如何使用 HarmonyOS 中的 Canvas 技术绘制时钟。我们将从最基础的知识开始,一步一步教你如何使用 Canvas 绘制出各种不同样式的时钟。即使你没有任何编程经验,也可以轻松上手。
首先,我们需要创建一个新的 HarmonyOS 项目。
import ohos.agp.components.AttrSet;
import ohos.agp.components.Component;
import ohos.agp.components.DirectionalLayout;
import ohos.app.Context;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import ohos.media.image.PixelMap;
import ohos.multimodalinput.event.TouchEvent;
import ohos.multimodalinput.event.TouchEventWrapper;
import ohos.sensors.data.BodyStatusInfo;
import ohos.sensors.data.SensorEvent;
import ohos.sensors.data.SensorEventConverter;
import ohos.utils.PacMap;
public class ClockComponent extends DirectionalLayout {
private static final HiLogLabel TAG = new HiLogLabel(HiLog.LOG_APP, 0x00201, "ClockComponent");
private PixelMap mPixelMap;
private TouchEventWrapper mTouchEventWrapper;
public ClockComponent(Context context) {
super(context);
mPixelMap = new PixelMap(100, 100, PixelMap.Format.ARGB_8888);
setBackground(mPixelMap);
}
public ClockComponent(Context context, AttrSet attrSet) {
super(context, attrSet);
mPixelMap = new PixelMap(100, 100, PixelMap.Format.ARGB_8888);
setBackground(mPixelMap);
}
@Override
public boolean onTouchEvent(TouchEvent event) {
mTouchEventWrapper.handleEvent(event);
return super.onTouchEvent(event);
}
@Override
public void onActive() {
super.onActive();
mTouchEventWrapper = new TouchEventWrapper(this);
}
@Override
public void onInactive() {
super.onInactive();
if (mTouchEventWrapper != null) {
mTouchEventWrapper.release();
}
}
@Override
public void onReceiveEvent(SensorEvent sensorEvent) {
super.onReceiveEvent(sensorEvent);
if (sensorEvent == null) {
return;
}
if (sensorEvent.getSensorType() == BodyStatusInfo.SENSOR_TYPE_STEP_COUNTER) {
PacMap pacMap = SensorEventConverter.convert(sensorEvent);
int stepCounter = pacMap.getIntValue(BodyStatusInfo.KEY_STEP_COUNTER);
HiLog.info(TAG, "stepCounter = " + stepCounter);
}
}
}
接下来,我们需要在项目中添加一个 Canvas 组件。
<DirectionalLayout xmlns:ohos="http://schemas.huawei.com/hap/ohos"
ohos:width="100vp"
ohos:height="100vp"
ohos:orientation="vertical">
<CanvasComponent
ohos:id="$+id:canvas_component"
ohos:width="100vp"
ohos:height="100vp" />
</DirectionalLayout>
然后,我们需要在 Java 代码中对 Canvas 组件进行初始化。
class ClockActivity extends Activity {
private ClockComponent mClockComponent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_clock);
mClockComponent = (ClockComponent) findViewById(R.id.canvas_component);
}
}
最后,我们需要在 Canvas 组件中绘制时钟。
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 获取画布的宽高
int width = canvas.getWidth();
int height = canvas.getHeight();
// 计算时钟的半径
int radius = Math.min(width, height) / 2;
// 计算时钟的中心点坐标
int centerX = width / 2;
int centerY = height / 2;
// 绘制时钟表盘
canvas.drawCircle(centerX, centerY, radius, new Paint());
// 绘制时钟刻度
for (int i = 0; i < 12; i++) {
double angle = i * 30 * Math.PI / 180;
float x = (float) (centerX + radius * Math.cos(angle));
float y = (float) (centerY + radius * Math.sin(angle));
canvas.drawCircle(x, y, 5, new Paint());
}
// 绘制时钟指针
float hour = getHour();
float minute = getMinute();
float second = getSecond();
double hourAngle = hour * 30 * Math.PI / 180;
double minuteAngle = minute * 6 * Math.PI / 180;
double secondAngle = second * 6 * Math.PI / 180;
float hourX = (float) (centerX + radius * 0.6 * Math.cos(hourAngle));
float hourY = (float) (centerY + radius * 0.6 * Math.sin(hourAngle));
canvas.drawLine(centerX, centerY, hourX, hourY, new Paint());
float minuteX = (float) (centerX + radius * 0.8 * Math.cos(minuteAngle));
float minuteY = (float) (centerY + radius * 0.8 * Math.sin(minuteAngle));
canvas.drawLine(centerX, centerY, minuteX, minuteY, new Paint());
float secondX = (float) (centerX + radius * 0.9 * Math.cos(secondAngle));
float secondY = (float) (centerY + radius * 0.9 * Math.sin(secondAngle));
canvas.drawLine(centerX, centerY, secondX, secondY, new Paint());
}
这样,我们就完成了如何使用 HarmonyOS 中的 Canvas 技术绘制时钟的介绍。