鸿蒙OpenHarmony【基于Hi3516DV300开发板(时钟应用开发)】

概述

本文将介绍如何快速搭建基于OpenHarmony标准系统(Hi3516DV300开发板)的应用开发环境,并基于一个时钟APP示例逐步展示应用的创建、开发、调试和安装等流程。示例代码可以通过本链接获取。

时钟App是一款显示实时时间的应用,显示效果如下图所示:

图 1 时钟应用显示效果图

title=

开发准备

首先需要下载和配置DevEco Studio,具体操作请参考DevEco Studio 使用指南。

开发步骤

应用的功能是通过表盘和数字显示实时时间。

从显示效果图分析可知,页面由两个部分组成:

  • 表盘栏:主要展示一个动态的钟表,且钟表指针能准确转动。
  • 数字时间栏:主要以数字形式显示当前时间。
  • 开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。

综上,我们可搭建一个纵向两行排列的弹性页面布局来实现界面的功能。具体开发步骤如下:

  1. 在hml文件中添加一个根节点div,注意每个hml文件中有且只能有一个根节点,代码如下:

    <div class="container">
    </div>

    class="container"表示组件使用的样式,container是index.css文件中的一个样式类,代码如下:

    .container {     
        flex-direction: column;
        justify-content: center;
        align-items: center;
        width: 100%;
        height: 100%;
    }

    在这个样式类中,我们分别设置了根组件div的高度和宽度(注意在应用的开发过程中,除部分组件(text)外必须显式指定组件的高度和宽度,否则可能无法显示)、并将flex-direction属性设置为column,该属性表示div的子组件是垂直方向从上到下排列;这样就可以实现本节开头所说的纵向两行排列的弹性页面布局。

  2. 实现时钟转动,需要使用“stack”组件。“stack”组件的功能是堆叠容器,子组件按照顺序依次入栈,后一个子组件覆盖前一个子组件。

    在根组件下添加一个stack容器,代码片段如下:

    <div class="container">    
        <stack class="stack">
            <image src="/common/clock_bg.png" class="clock-bg"></image> <!--设置表盘图片-->
            <image src="/common/hour_hand.png" class="clock-hand"
                   style="transform : rotate({{ hour * 30 + minute / 2 }}deg);"></image> <!--设置时钟图片,(hour * 30)一小时旋转30度,(minute / 2)时钟每分钟旋转的角度-->
            <image src="/common/minute_hand.png" class="clock-hand"
                   style="transform : rotate({{ minute * 6 + second / 10 }}deg);"></image> <!--设置分钟图片,(minute * 6)一分钟旋转6度,(second / 10)分钟每秒钟旋转的角度-->
            <image src="/common/second_hand.png" class="clock-hand"
                   style="transform : rotate({{ second * 6 }}deg);"></image> <!--设置秒钟图片,(second * 6)一秒旋转6度-->
       </stack>
    </div>

    style="transform : rotate({{ second * 6 }}deg) 这类代码用来设置组件的旋转事件。其中transform是设置动画平移/旋转/缩放的属性,rotate是旋转动画属性,支持设置x轴和y轴两个维度的选中参数。

    在css文件中设置"stack"组件样式的高度、宽度、位置等属性,代码如下:

    .stack {
        flex-direction: column;
        justify-content: center;
        align-items: center;
        width: 100%;
        height: 50%;
    }

    在css文件中设置"clock-bg"组件样式的高度、宽度等属性,代码如下:

    .clock-bg {
        width: 80%;
        height: 80%;
        object-fit: scale-down;
    }

    在css文件中设置"clock-hand"组件为时针、分针和秒针的高度、宽度等属性,代码如下:

    .clock-hand {
        width: 25%;
        height: 65%;
        object-fit: contain;
    }

    index.js中会有一个定时器实时刷新时分秒变量,从而触发时间界面自动更新。对应的js代码如下:

    export default {
        timer: undefined,
        //定义参数
        data: {
          hour: 0,   //定义小时
          minute: 0, //定义分钟
          second: 0  //定义秒
        },
        onInit () {
            this.updateTime();
            this.timer = setInterval(this.updateTime, 1000)//设置1s的定时器
        },  
        updateTime: function () {       
            var nowTime = new Date()    
            this.hour = nowTime.getHours()    
            this.minute = nowTime.getMinutes()   
            this.second = nowTime.getSeconds()    
            if (this.hour < 10) {        
                this.hour = '0' + this.hour    
            }  
            if (this.minute < 10) {       
                this.minute = '0' + this.minute   
            }    
            if (this.second < 10) {      
                this.second = '0' + this.second   
            }
        },
    }

  3. 显示数字时间,在钟表下面以数字形式显示当前时间。在根布局内末尾加上text组件,页面结构如下:

    <text class="digit-clock"> {{ hour }}:{{ minute }}:{{ second }}</text>

    class="digit-clock"设置了组件的高度和宽度以及字体大小,其代码如下:

    .digit-clock {    
        font-size: 58px;   
        width: 100%;
        margin-top: 0px;
        text-align: center;
    }

  4. 所有组件设置样式、动画效果和数据动态绑定,完整代码如下所示:

    • index.hml文件

      <div class="container">
          <stack class="stack">
              <image src="/common/clock_bg.png" class="clock-bg"></image>
              <image src="/common/hour_hand.png" class="clock-hand"
                     style="transform : rotate({{ hour * 30 + minute / 2 }}deg);"></image>
              <image src="/common/minute_hand.png" class="clock-hand"
                     style="transform : rotate({{ minute * 6 + second / 10 }}deg);"></image>
              <image src="/common/second_hand.png" class="clock-hand"
                     style="transform : rotate({{ second * 6 }}deg);"></image>
          </stack>
          <text class="digit-clock">{{ hour }}:{{ minute }}:{{ second }}</text>
      </div>

    • index.css文件

      .container {
          flex-direction: column;
          justify-content: center;
          align-items: center;
          width: 100%;
          height: 100%;
      }
      
      .stack {
          flex-direction: column;
          justify-content: center;
          align-items: center;
          width: 100%;
          height: 50%;
      }
      
      .digit-clock {
          font-size: 58px;
          width: 100%;
          margin-top: 0px;
          text-align: center;
      }
      
      .clock-bg {
          width: 80%;
          height: 80%;
          object-fit: scale-down;
      }
      
      .clock-hand {
          width: 25%;
          height: 65%;
          object-fit: contain;
      }

    • index.js:

      js文件主要用于实现App应用的逻辑交互。在本页面js文件中,需要实现如下功能:定时获取系统时间。

      export default {
          timer: undefined,
          data: {
              hour: 0,
              minute: 0,
              second: 0
          },
          onInit() {
              this.updateTime()
              this.timer = setInterval(this.updateTime, 1000)
          },
          updateTime: function () {
              var nowTime = new Date()
              this.hour = nowTime.getHours()
              this.minute = nowTime.getMinutes()
              this.second = nowTime.getSeconds()
              if (this.hour < 10) {
                  this.hour = '0' + this.hour
              }
              if (this.minute < 10) {
                  this.minute = '0' + this.minute
              }
              if (this.second < 10) {
                  this.second = '0' + this.second
              }
          },
          onDestroy() {
              clearInterval(this.timer);
          }
      }

签名打包

代码编写完成后,在真机设备上运行应用,需要先对应用进行签名,然后再进行打包,具体操作请参考签名打包指导。

真机运行

应用签名打包后即可安装到开发板。安装应用前需要先完成[DevEco Device Tool的安装配置],然后将OpenHarmony系统烧录到开发板并运行。编译烧录、运行镜像的基本操作请参考快速入门手册:[标准系统Hi3516快速入门]。完成镜像运行,系统正常启动后,执行如下步骤安装或卸载应用。

  1. 从开发者工具代码仓路径中获取hdc客户端。

    developtools/hdc_standard/prebuilt/windows/hdc_std.exe

    修改名称为hdc.exe,并将工具路径加入系统环境path变量中。

  2. 启动cmd命令窗口,执行以下命令,推送hap应用包到设备目录下并安装。

    hdc install clock.hap

  3. 启动应用。执行以下命令,其中ohos.samples.clock为应用包名,MainAbility为应用启动的Ability。

    hdc shell aa start -d 123 -a ohos.samples.clock.MainAbility -b ohos.samples.clock

  4. 卸载应用(可选)。执行以下命令,其中ohos.samples.clock为应用包名。

    hdc shell bm uninstall -n ohos.samples.clock

常见问题

搜狗高速浏览器截图20240326151547.png

hdc_std连接不到设备

  • 现象描述

    执行 "hdc_std list targets"命令后结果为:[Empty]

  • 可能原因和解决方法

    1. 设备没有被识别:

      在设备管理器中查看是否有hdc设备,在通用串行总线设备中会有“HDC Device”信息。如果没有,hdc无法连接。此时需要插拔设备,或者烧写最新的镜像。

    2. hdc_std工作异常:

      可以执行"hdc kill"或者"hdc start -r"杀掉hdc服务或者重启hdc服务,然后再执行hdc list targets查看是否已经可以获取设备信息。

    3. hdc_std与设备不匹配:

      如果设备烧写的是最新镜像,hdc_std也需要使用最新版本。由于hdc_std会持续更新,请从开源仓developtools_hdc_standard中获取,具体位置在该开源仓的prebuilt目录。

hdc_std运行不了

  • 现象描述

    点击hdc_std.exe文件无法运行。

  • 可能原因和解决方法

    hdc_std.exe不需要安装,直接放到磁盘上就能使用,也可以添加到环境变量中。通过打开cmd执行hdc_std命令直接使用。

鸿蒙Next核心技术分享

1、鸿蒙基础知识←《鸿蒙NEXT星河版开发学习文档》

2、鸿蒙ArkUI←《鸿蒙NEXT星河版开发学习文档》

3、鸿蒙进阶技术←《鸿蒙NEXT星河版开发学习文档》

 4、鸿蒙就业高级技能←《鸿蒙NEXT星河版开发学习文档》 

 5、鸿蒙多媒体技术←《鸿蒙NEXT星河版开发学习文档》 

6、鸿蒙南向驱动开发←《鸿蒙NEXT星河版开发学习文档》  

7、鸿蒙南向内核设备开发←《鸿蒙NEXT星河版开发学习文档》  

 8、鸿蒙系统裁剪与移植←《鸿蒙NEXT星河版开发学习文档》  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/600741.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sarcasm detection论文解析 |CAT-BiGRU

论文地址 论文地址&#xff1a;CAT-BiGRU: Convolution and Attention with Bi-Directional Gated Recurrent Unit for Self-Deprecating Sarcasm Detection | Cognitive Computation github:Ashraf-Kamal/Self-Deprecating-Sarcasm-Detection (github.com) 论文首页 笔记框架 …

传统汽车空调系统工作原理

1.首先讲一个概念 液体变成气体&#xff1a;吸热 气体变成液体&#xff1a;放热 2.在汽车空调系统中热量的传递的介质不是水&#xff0c;而是氟利昂&#xff0c;简称&#xff1a;“氟”。 3.传统式汽车空调结构如下 该三个部件位于车头进气口位置 该部位位于汽车驾驶车厢前方…

QX-mini51单片机学习(1)---电子电路基础

目录 1电平特性 2单片机io口简绍 3初识电容电阻 4初识电路原理图 5单片机最小系统结构 6单片机工作基本时序 1电平特性 单片机是一种数字集成芯片&#xff0c;数字电路中两种电平&#xff0c;高电平与低电平 高电平&#xff1a;5v 低电平&#xff1a;0v TTL电平信号…

重庆大足某厂不锈钢管件酸洗钝化-智渍洁

简报&#xff1a;重庆大足某厂不锈钢管件酸洗钝化 重庆大足某厂不锈钢管件酸洗钝化 - 重庆智渍洁环保科技有限公司简报&#xff1a;重庆大足某厂不锈钢管件酸洗钝化https://www.zhizijie.com/hl/zixun/gongsi/237.html

数据流转的艺术:深度解析tee命令的应用技巧

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 数据流转的艺术&#xff1a;深度解析tee命令的应用技巧 前言tee命令简介tee命令的基本用法tee命令的高级功能 前言 在Linux的世界里&#xff0c;有一位不太引人注意但却异常强大的命令&#xff0c;那…

上海个人购房提取公积金经历和注意事项(收藏不踩坑)

在前一篇文章中&#xff0c;我介绍了 2024 年 4 月 24 日上海个人购房个税退税经历&#xff0c;我于 4 月 27 日周六&#xff0c;顺利办理租房公积金提取业务&#xff0c;资金在业务办理完成后 10 分钟左右到账。通过本文分享办理过程的材料和注意事项&#xff0c;避免大家踩坑…

HackMyVM-Slowman

目录 信息收集 arp nmap whatweb WEB web信息收集 gobuster FTP匿名登录 hydra mysql爆破 mysql登录 fcrackzip爆破 hashcat爆破 ssh登录 提权 系统信息收集 python Capabilities提权 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interf…

【Java 刷题记录】前缀和

前缀和 25. 一维前缀和 示例1&#xff1a; 输入&#xff1a; 3 2 1 2 4 1 2 2 3输出&#xff1a; 3 6import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(S…

信创 | 信创产业数字化转型与升级:路径规划与实践!

信创产业的数字化转型与升级路径&#xff0c;主要围绕着构建国产化信息技术软硬件底层架构体系和全周期生态体系&#xff0c;解决核心技术关键环节“卡脖子”的问题&#xff0c;以推动中国经济数字化转型的平稳健康发展。 一、信创产业的发展趋势包括&#xff1a; 加强国产信息…

️测试问我:为啥阅读量计数这么简单的功能你都能写出bug?

前言 可乐他们团队最近在做一个文章社区平台,由于人手不够,后端部分也是由前端同学来实现,使用的是 nest 。 今天他接到了一个需求,就是在用户点开文章详情的时候,把阅读量 +1 ,这里不需要判断用户是否阅读过,无脑 +1 就行。 它心想:这么简单,这不是跟 1+1 一样么。…

使用pandas的merge()和join()函数进行数据处理

目录 一、引言 二、pandas的merge()函数 基本用法 实战案例 三、pandas的join()函数 基本用法 实战案例 四、merge()与join()的比较与选择 使用场景&#xff1a; 灵活性&#xff1a; 选择建议&#xff1a; 五、进阶案例与代码 六、总结 一、引言 在数据分析和处理…

领航法律科技,法大大多年深耕再获认可!

近日&#xff0c;“乘势破局 第八届新兴法律服务业高峰论坛”在上海隆重举行。作为国内领先的电子签厂商&#xff0c;法大大凭借在法律科技领域的多年深耕与沉淀&#xff0c;荣获“法律科技领航机构”称号。 据悉&#xff0c;新兴法律服务业高峰论坛作为国内首个聚焦“新兴法律…

董事长张轶群刚被罚,合规问题屡见不鲜,富友支付IPO胜算几何?

第三方支付机构富友支付又双叒来冲刺上市了。 与此前两次冲刺A股不同的是&#xff0c;富友支付此次选择在港股上市。近日&#xff0c;富友支付向港交所主板递交上市申请&#xff0c;联席保荐人为中信证券、申万宏源香港。值得一提的是&#xff0c;此前的2018年、2021年&#x…

网络基础——路由

网络基础——路由 要想网络畅通&#xff0c;应让网络中的路由器知道如何转发数据包到各个网段。路由器根据路由表来转发数据包&#xff0c;而路由表是通过直连网络、静态路由以及动态路由来构建的。 route命令&#xff0c;底层是使用ioctl实现&#xff1b;ip命令&#xff0c;…

Misc 流量分析

流量分析简介 网络流量分析是指捕捉网络中流动的数据包&#xff0c;并通过查看包内部数据以及进行相关的协议、流量分析、统计等来发现网络运行过程中出现的问题。 在CTF比赛中&#xff0c;以及各种技能大赛对于流量包的分析取证是一种十分重要的题型。通常这类题目都是会提供…

Java | Leetcode Java题解之第66题加一

题目&#xff1a; 题解&#xff1a; class Solution {public int[] plusOne(int[] digits) {int n digits.length;for (int i n - 1; i > 0; --i) {if (digits[i] ! 9) {digits[i];for (int j i 1; j < n; j) {digits[j] 0;}return digits;}}// digits 中所有的元素…

【牛客】【模板】差分

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 差分模板。 b[0]a[0]; b[1]a[1]-a[0]; b[2]a[2]-a[1]; ...... b[n-1]a[n-1]-a[n-2]; b[n]a[n]-a[n-1]; 差分标记&#xff1a;b[l]k,b…

2024年荆州中级工程师报名开始了吗?

2024年荆州中级工程师职称报名已经开始了 2024年荆州中级职称报名时间&#xff1a; &#xff08;一&#xff09;网上报名时间&#xff1a; 4月26日9时至5月10日16时。超过时间将不能操作。 &#xff08;二&#xff09;网上缴费时间&#xff1a; 4月26日9时至5月10日24时 网上…

(五)JVM实战——JVM性能调优与监控

JVM调优案例的场景 为什么要调优&#xff1a;防止或者解决jvm虚拟机中的OOM问题&#xff1b;减少FullGC出现的频率&#xff0c;解决系统运行卡、慢问题JVM调优案例的四个方面 OOM(堆溢出)&#xff1a;java heap spaceOOM(元空间溢出)&#xff1a;MetaspaceOOM(GC overhead lim…

分析错误ValueError: could not determine the shape of object type ‘Series‘

这个错误提示 ValueError: could not determine the shape of object type Series 通常发生在尝试将 pandas 的 Series 直接转换为 PyTorch 的 tensor 时&#xff0c;尤其是当 Series 的数据类型不明确或者包含非数值类型的数据时。为了修正这个问题&#xff0c;确保在转换之前…