返回

HarmonyOS 使用 Canvas 绘制时钟:简单、精确、高效

前端

好的,根据你的要求,我将生成一篇关于“鸿蒙--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 技术绘制时钟的介绍。