简单时钟
介绍
本示例通过使用@ohos.display接口以及Canvas组件来实现一个简单的时钟应用。
效果预览
使用说明
1.界面通过setInterval实现周期性实时刷新时间,使用Canvas绘制时钟,指针旋转角度通过计算得出。
例如:"2 * Math.PI / 60 * second"是秒针旋转的角度。
具体实现
- 本示例展示简单时钟的方法主要封装在Index中,源码参考:[Index.ets] 。
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { display } from '@kit.ArkUI';
import Logger from '../utils/Logger';
import DrawClock from '../utils/DrawClock';
import CommonConstants from '../common/CommonConstants';
const HEIGHT_ADD: number = CommonConstants.HEIGHT_ADD; // 表盘下面需要绘制时间,canvas高度是宽度加150
const TAG: string = 'Index';
@Entry
@Component
struct Clock {
@State canvasWidth: number = CommonConstants.DEFAULT_WATCH_SIZE; // 300是表盘默认大小
private settings: RenderingContextSettings = new RenderingContextSettings(true);
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
private radius: number = CommonConstants.DEFAULT_WATCH_RADIUS; // 默认表盘半径
private intervalId: number = 0;
private drawClock: DrawClock = new DrawClock();
updateTime = () => {
this.context.clearRect(0, 0, this.canvasWidth, this.canvasWidth + HEIGHT_ADD);
let nowTime = new Date();
let hour = nowTime.getHours();
let minute = nowTime.getMinutes();
let second = nowTime.getSeconds();
let time = `${this.fillTime(hour)}:${this.fillTime(minute)}:${this.fillTime(second)}`;
this.drawClock.drawClock(this.context, this.radius, this.canvasWidth, hour, minute, second, time)
this.context.translate(-this.radius, -this.radius);
}
fillTime(time: number) {
return time < CommonConstants.NUMBER_TEN ? `0${time}` : `${time}`;
}
onPageShow(): void {
this.updateTime();
this.intervalId = setInterval(this.updateTime, CommonConstants.INTERVAL_TIME)
}
onPageHide() {
clearInterval(this.intervalId);
}
aboutToAppear() {
this.getSize();
}
// 获取设备宽高计算表盘大小
async getSize() {
let mDisplay = display.getDefaultDisplaySync();
Logger.info(TAG, `getDefaultDisplay mDisplay = ${JSON.stringify(mDisplay)}`);
this.canvasWidth = px2vp(mDisplay.width > mDisplay.height ? mDisplay.height * CommonConstants.CONVERSION_RATE :
mDisplay.width * CommonConstants.CONVERSION_RATE);
this.radius = this.canvasWidth / CommonConstants.NUMBER_TWO;
}
build() {
Stack({ alignContent: Alignment.Center }) {
Canvas(this.context)
.padding({ top: $r('app.float.canvas_padding_top') })
.width(this.canvasWidth)
.height(this.canvasWidth + HEIGHT_ADD)
.onReady(() => {
this.updateTime();
this.intervalId = setInterval(this.updateTime, CommonConstants.INTERVAL_TIME);
})
}
.width(CommonConstants.FULL_PERCENTAGE)
.height(CommonConstants.FULL_PERCENTAGE)
}
}
- 设置表盘大小:通过Index中的display.getDefaultDisplay()方法来获取设备宽高计算表盘大小;
- 获取当前时间:调用updateTime函数,执行new Date().getHours()、new Date().getMinutes()、new Date().getSeconds()获取当前时间。
- 绘制表盘内容:通过CanvasRenderingContext2D来画表盘背景、时针、分针、秒针、圆心以及表盘下方文本;
- 启动时钟:添加setInterval定时器,每隔1s执行一次updateTime函数。
以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下:
内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!
鸿蒙【北向应用开发+南向系统层开发】文档
鸿蒙【基础+实战项目】视频
鸿蒙面经
为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!