40
社区成员
发帖
与我相关
我的任务
分享
大家好,非常感谢大家愿意参与开放原子开源极客社 HarmonyOS的学习,也非常感谢大家赏脸看我自己写的教程。那为啥不像AL一样,直接布置任务,让大家在网上找资源学习呢?难道网上没有HarmonyOS的教程吗?
其实有,但没完全有。
目前根据HarmonyOS 的SDK版本,可以采用三种语言,一是Java,一是类似html的格式(HarmonyOS里面叫做HML,和html有点不同),还有一种叫ArkTS,文件后缀叫做ets,是华为自己整的一套语言。网上的教程和资源最主要都是java以及ArkTS的版本,甚至黑马都只出了这两个版本的教程。至于HML,无论是论坛,还是第三方教程,或者单纯的分享帖子,都少得可怜。当时做项目的时候一天天在各大网站上扒拉零星的资料,和华为鸿蒙工程师斗智斗勇,既费时又费力。那几天队友们都回家放假了,我还在学校埋头苦干,甚至因为做不出来,开始怀疑这个项目的可行性了(不过有一部分确实是自己太蠢了,这里强调一下交流的重要性)。因此,借着开源社团的渠道,我想自己整一个HML的教程,至少让大家入门可以稍微简单一些。至于我怎么会的,我大一的时候,参加了一个鸿蒙的微专业,不过今年好像没有了,不然真的推荐去报个名。
问题来了。为什么我没有教其他两个语言的呢?
几个原因:第一,这两个版本的教程网上很完备了,如果大家想学其他两种,可以自己去跟着黑马的教程去学。第二,由于面向的是原先算法组的同学,有可能在后面做项目的时候,会负责一些前端的东西。由于HML和H5C3相似,即使你们用不到鸿蒙的东西,也可以比较快上手H5C3。
OK,在开始之前,我再交代几件事情:
OK,祝大家学习愉快~
写于2024.3.8
本讲要点: 了解HarmonyOS概念,完成DevEco Studio的安装与使用,了解工程目录,学习Flex布局
这个部分大家稍微了解一下即可,对后面的开发影响不大。

内核层主要包括内核子系统和驱动子系统两个部分。


根据系统的组件化裁剪程度, HarmonyOS设备支持的API也会有所不同。
应用层包括系统应用和第三方非系统应用。
多种设备之间能够实现硬件互助、资源共享,主要依赖以下四个关键分布式技术。

分布式软总线是手机、平板、智能穿戴、智慧屏、车机等分布式设备的通信基座,为设备之间的互联互通提供了统一的分布式通信能力,为设备之间的无感发现和零等待传输创造了条件。开发者只需聚焦于业务逻辑的实现,无需关注组网方式与底层协议。

分布式设备虚拟化平台可以实现不同设备的资源融合、设备管理、数据处理,多种设备共同形成一个超级虚拟终端。针对不同类型的任务,为用户匹配并选择能力合适的执行硬件,让业务连续地在不同设备间流转,充分发挥不同设备的能力优势,如显示能力、摄像能力、音频能力、交互能力以及传感器能力等。

用户数据不再与单一物理设备绑定,业务逻辑与数据存储分离,跨设备的数据处理如同本地数据处理一样方便快捷,让开发者能够轻松实现全场景、多设备下的数据存储、共享和访问,为打造一致、流畅的用户体验创造了基础条件。

分布式任务调度基于分布式软总线、分布式数据管理、分布式 Profile 等技术特性,构建统一的分布式服务管理(发现、同步、注册、调用)机制,支持对跨设备的应用进行远程启动、远程调用、远程连接以及迁移等操作,能够根据不同设备的能力、位置、业务运行状态、资源使用情况,以及用户的习惯和意图,选择合适的设备运行分布式任务。

HarmonyOS 提供了用户程序框架、Ability 框架以及 UI 框架,支持应用开发过程中多终端的业务逻辑和界面逻辑进行复用,能够实现应用的一次开发、多端部署,提升了跨设备应用的开发效率。

HarmonyOS 通过组件化和小型化等设计方法,支持多种终端设备按需弹性部署,能够适配不同类别的硬件资源和功能需求。支撑通过编译链关系去自动生成组件化的依赖关系,形成组件树依赖图,支撑产品系统的便捷开发,降低硬件设备的开发门槛。
这一部分需要各位重点看一看。 因为HarmonyOS与OpenHarmony是两个非常重要的概念,虽然联系非常紧密(看名字也是),但是有本质的区别。之前打华为ICT大赛的时候,我有个其他队伍的同学就把HarmonyOS说成了OpenHarmony。(但是最后她们队进了决赛,我反倒没进,我很纳闷)
开放原子开源基金会(简称“基金会”)于 2020 年 9 月接受华为捐赠的智能终端操作系统基础能力相关代码,随后进行开源,并根据命名规则为该开源项目命名为 OpenAtom OpenHarmony(简称“OpenHarmony”)。
华为通过开源引入OpenHarmony开源项目,结合自研闭源应用和闭源HMS能力,构建华为自研产品的完整解决方案,即HarmonyOS。

安装教程
当然你也可以查看其他帖子。
安装完成之后,我们点击文件->新建->新建项目,跳出窗口:


点击Finish。这样你就成功创建了一个工程文件。

这一部分,我会挑一些在未来开发工程时会接触到的部分目录来解释。后面在讲解过程中会涉及到每个部分的使用。

在这一部分,大家只需要先过一遍,等到需要的时候,随时回来查阅即可,大不了多换几个看看效果。
Flex布局又名“弹性布局”,用来为盒状模型提供最大的灵活性。

flex-direction属性决定主轴的方向(即项目的排列方向)。它的值可选项有:

flex容器是单行还是多行显示,该值暂不支持动态修改。它的值可选项有:

justify-content属性定义了项目在主轴上的对齐方式。可选项有:


交叉轴中有额外的空间时,多行内容对齐格式,可选值为:




说了一堆,我们用实例来进行举例。

首先对index页面下的三个文件进行解释:
由于是新建文件,没有做任何修改,所以我们这个时候点击界面右侧的预览器(下图右下角)


这个预览器可以短时间生成当前页面的预览情况,便于短时间查看页面情况。点击右上角的回转图标可以刷新当前页面。点击第二行图标中的倒三角形图标可以更换设备。手机上方的几个按钮分别为返回、旋转设备以及更换深色模式。
现在请大家把三个文件分别修改成如下形式(比较方便入门):
index.css:
.container {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
left: 0px;
top: 0px;
width: 100%;
height: 100%;
}
.title {
font-size: 40px;
text-align: center;
width: 100%;
height: 40%;
margin: 10px;
}
index.hml:
<div class="container">
<text class="title">
您好,世界
</text>
</div>
index.js:
export default {
data: {
},
onInit() {
}
}
然后再次点击刷新图标以刷新预览。
现在来解释一下以上代码:
我们先看hml文件。div是基础容器组件,用作页面结构的根节点或将内容进行分组。而text则是文本的基础组件,用于呈现一段信息。从缩进关系中我们可以看出来,text组件是包含在div基础组件中的。而class则表示组件的样式属性,我们可以通过class设置不同的类。
那么这个class有什么用呢?我们看到css文件中有div和text对应的class,即container与title。也就是说,我们可以通过class,在css文件中编写对应类的样式。大家可以点击一下,对应着官方API参考来理解每一个样式,推荐大家稍微改一改样式来看看效果。
我们再看js文件,data用来储存数据,onInit()则是页面启动时就执行的方法。目前空空如也,后面会用到。
我们现在随便改一下text中的内容:
<div class="container">
<text class="title">
我来自深圳大学
</text>
</div>
刷新之后效果如下:

.container {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
left: 0px;
top: 0px;
width: 100%;
height: 100%;
background-color: blue;
}
.title {
font-size: 80px;
text-align: start;
width: 100%;
height: 40%;
margin: 10px;
}
我在container下增加了background-color样式,然后把text-align改成了start,再修改了title的font-size,即字体大小。效果如下:

当然可以啊。我在class为container的div里头再添加了一个class为inside的div:
index.css:
.container {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
left: 0px;
top: 0px;
width: 100%;
height: 100%;
background-color: blue;
}
.title {
font-size: 80px;
text-align: start;
width: 100%;
height: 40%;
margin: 10px;
}
.inside{
width:50%;
height: 50%;
background-color: yellow;
}
index.hml:
<div class="container">
<text class="title">
我来自深圳大学
</text>
<div class="inside">
</div>
</div>
index.js 不做修改
效果如下:
