导读:在本篇文章里,您将掌握鸿蒙开发工具DevEco的基本使用、ArkUI里的基础组件,并通过制作一个简单界面掌握使用
工欲善其事,必先利其器。这节就让我们来看看以后会伴随我们鸿蒙开发的工具,如何下载使用
为保证DevEco Studio正常运行,建议电脑配置满足如下要求:
操作系统:Windows10 64位、Windows11 64位
内存:16GB及以上
硬盘:100GB及以上
分辨率:1280*800像素及以上
操作系统:macOS(X86) 12/13/14 macOS(ARM) 12/13/14
内存:8GB及以上
硬盘:100GB及以上
分辨率:1280*800像素及以上
注意:windows版内存需16GB以上,mac需8GB以上,不满足的话可能开发过程会相对比较卡。
DevEco安装后界面默认是英文的,如果更习惯看中文界面,可通过如下方式设置
windows版修改:
chinese -> 启用 -> 重启DevEcho后生效


mac版修改



进入配置工程界面,Compatible SDK选择“5.0.0(12)”(默认就是它,这就是鼎鼎大名的纯血鸿蒙版),其他参数保持默认设置即可。

点击Finish,工具会自动生成示例代码和相关资源,等待工程创建完成。

如上图所示:
左侧的大区域为项目资源管理区,项目的一切资源都在这里展示
entry这个文件夹即可,我们早期的所有代码都在这个文件夹里编辑entry->src->main->ets->pages这个文件夹早期会成为我们写页面的地方entry->src->main->resource这个文件夹将来会作为我们放图片资源和国际化的地方中间是代码编辑区域,以后写代码就是在这里了,如果你觉得中间区域不够大,可以把左侧面板缩小甚至折叠
右侧是侧边工具栏,前期我们最常用的就是预览器,这个地方就是实时查看界面效果的地方,并且代码一改,预览器自动刷新

Tips:新建项目后,页面代码里默认就会有个
Text,并且打开预览器会看到Hello World,尝试修改Text小括号里的内容,给它一个字符串,试试看预览器会否有变化呢?
ArkTS是HarmonyOS优选的主力应用开发语言,ArkTS是在TypeScript(简称TS)生态基础上做了进一步扩展,保持了TS的基本风格,同时通过规范定义强化开发期静态检查和分析,提升程序执行稳定性和性能。
这里做个简单说明:TypeScript相当于扩展了JavaScript,多了些语法。而ArkTS又相当于扩展了TypeScript,关系如下图

从上图可以看到JS、TS拥有的语法,ArkTS也有,甚至更多(主要添加了一些声明式UI语法)。
Object.getOwnPropertyDescriptor之类的这种方法。所以大家可以四舍五入默认TS的语法ArkTS都能用即可最后,猫林老师要说明一点非常重要的事:本教程不会做基础语法讲解
猫林老师默认本文章的读者至少是懂:变量、常量、分支语句、循环语句、函数、数组、对象、类、接口这些内容的
纳尼?你毛都不会?那麻烦出门左转买包华子抽根烟冷静下。然后坐等猫林老师将来出语法教程。

如果你懂TS,那么可以说接下来的语法你毫无压力,只是随着学习了解一些ArkTS新增的语法(这个猫林老师会讲)
如果你仅仅只懂JS,其实问题也不大。TS本身在语法层面跟JS区别不大,而且语言是相通的,只要你明白变量、常量、分支语句等等这些概念,其实到时候一看猫林老师的代码,就知道是啥意思。
就好比下面这句代码
let age: number = 16退一万步说,假设后面的教程里如果有某个语法你看不懂是什么意思,也可以搜一搜,或者利用AI解答一下,或者直接留言问猫林老师也可以的。绝对不会影响学习进度和体验。而且这样相当于在新知识中补全自己的TS水平,猫林老师觉得大赞呢!
好了,废话不多说。接下来,我们正式进入到鸿蒙开发的世界!


Text是我们新建项目后在build里见到的第一个组件。看名字都知道,这货肯定是用来显示文本的,就像上图,我们能看到文字,就是因为在build里有一个Text
用法
Text('文字内容')单引号、双引号、模板字符串反引号都可自己动手试试
来到pages/index.ets文件,把build里的代码都删掉,直接写一个Text试试,例如
@Entry
@Component
struct Index {
build() {
Text('猫林老师')
}
}效果如下

通过效果我们发现Text果然能显示文本,但是如果觉得文本默认样式不是你喜欢的,你还可以对它修改属性,以后组件的属性修改语法统一都是
组件() {
}
.属性(属性值)注意:在ArkTS里,所有的属性都是以方法形式存在的,所以也称之为属性方法
那Text有哪些常用属性呢?这里猫林老师列一下
代码例
@Entry
@Component
struct Index {
build() {
Text('猫林老师')
.fontSize(32) // 设置字体大小为32
.fontColor('#f00') // 设置字体颜色为红色,也可以写 'rgb(255,0,0)',效果一样
.fontWeight(700) // 设置字体粗细为700(加粗了)
}
}之前猫林老师说了,颜色可以写16进制,也可以写rgb,所以上述代码你换成.fontColor('rgb(255,0,0)')效果也一样,但要注意的是,他们都得是字符串,即被引号包起来
但是像上述代码,文字颜色、文字粗细这种要么是写字符串,要么写数字的,其实阅读起来并不直观。所以华为还提供了枚举来修改
@Entry
@Component
struct Index {
build() {
Text('猫林老师')
.fontSize(32)
.fontColor(Color.Red)
.fontWeight(FontWeight.Bold)
}
}这里的Color.Red相当于是'#f00'或'rgb(255,0,0)',但是用这种华为提供的枚举写法,会更加便于阅读,一看就知道是红色
这里的FontWeight.Bold相当于是700,但是一看Bold就是加粗
注意:华为内置枚举的首字母一般都大写
在DevEco开发工具里,其实只要一写好枚举类型再按一个点,它会自动出对应的值的提示,选中一个就好,如下图

Text后,我们发现,当我们尝试要多加一个Text后,会报错,如下图
这是为什么呢?难道不允许猫林老师很帅?
这是因为在鸿蒙开发里,也遵循一个页面(或一个自己封装的组件)必须有且只有一个根组件的规定
那么,什么是根组件呢?
所以上图报错,正是因为我们有两个Text,但它并没有一个包住他们的最外部容器
Text时不报错呢?因为只有1个时,它既是根组件又是内容解决办法:在build里面,两个Text最外面包一个Column
build() {
Column() {
Text('猫林老师')
.fontSize(32)
.fontColor(Color.Red)
.fontWeight(FontWeight.Bold)
Text('很帅')
}
}此时效果如下

Column组件是ArkUI里专门用来做纵向布局的容器组件
特点:能让它的子组件从上到下进行排列
用法:
Column () {
// ...
}所以上例中,我们给两个Text一旦加上Column这个父组件后,他们就一上一下排列了
一般情况下,页面的根容器需要铺满整个页面,所以需要给宽高。如果不给,默认是它的内容多大,它就多大
注意:猫林老师在这里给大家提炼一个ArkUI的特点:任何组件不给宽高默认都无宽高,全是靠内容自动撑开
所以一般情况下,我们还会给Column设置宽高,继续修改上述案例,添加宽高
Column() {
Text('猫林老师')
.fontSize(32)
.fontColor(Color.Red)
.fontWeight(FontWeight.Bold)
Text('很帅')
}
.width('100%')
.height('100%')此时结果如下

加完Column这个根容器后,我们还发现两个文字都水平居中了,原因跟Column的默认排列方式有关,所以我们来了解下
首先需要了解在鸿蒙开发中的坐标系,分为两个轴。

然后在Column布局容器里,因为默认情况下Column是让子组件从上往下排列,所以把y轴这根轴称之为主轴,x轴称之为交叉轴
默认情况下,Column会让子组件在主轴方向,默认是从起点开始排列对齐,而在交叉轴方向是默认居中
因此,我们会发现上述案例两个Text,在Y轴最顶端(因为Y是主轴),在X轴居中(因为X是交叉轴)
能否修改子组件在主轴、交叉轴上的排列呢?当然可以,请看下图
设置主轴方向的排列方式

发现通过justifyContent属性可以设置子组件在主轴方向排列方式,一共有六种取值
题外话:会CSS的同学会发现这无非就是Flex布局,只不过比CSS的Flex布局多了SpaceEvenly
如果你想主轴方向排列自己设置子组件之间的间距,可以用传入space参数,用法如下
Column ({ space: 10 }) {
// 子组件
}
设置子元素在交叉轴方向的排列(通过设置AlignItems属性)

发现通过HorizontalAlign属性可以设置子元素在交叉轴方向排列方式,一共有三种取值
检验所学:
思考,如何让上述案例两个文字,无论垂直还是水平方向都居中呢?
没错,就是给Column设置justifyContent属性,并且值为FlexAlign.Center,即能实现在主轴(垂直方向)居中。然后设置AlignItems属性为HorizontalAlign.Center,其中AlignItems可以不用设置,因为默认就是交叉轴居中
代码如下
Column() {
Text('猫林老师')
.fontSize(32)
.fontColor(Color.Red)
.fontWeight(FontWeight.Bold)
Text('很帅')
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
.alignItems(HorizontalAlign.Center)Row组件是ArkUI里专门用来做横向布局的容器组件
特点:能让它的子组件从左到右进行排列
用法也跟Column差不多,只不过他们主轴不一样。Row的主轴是X轴,交叉轴是Y轴
设置主轴方向的排列方式

HorizontalAlign的六个值,效果一样,只不过变成了在x轴(水平方向排列)设置交叉方向的排列

注意:设置交叉轴,依然是用AlignItems属性,但是取值变成了 VerticalAlign,毕竟它就是设置垂直方向,所以叫VerticalAlign
这时候有懒货说了,老师,一会HorizontalAlign,一会VerticalAlign,我记不住怎么办?这时候不得不说DevEco的强大提示功能了,你只要一写AlignItems它就会给你提示填什么内容,如下图

同样的,如果想自己手动设置主轴方向上子组件的间距,也可以用space
Column ({ space: 10 }) {
// 子组件
}
Row看看效果,并尝试改它的主轴和交叉轴排列专门用来显示图片的组件
Image支持png、jpg、jpeg、bmp、svg、webp、gif和heif类型的图片格式
可以加载本地图片(项目内图片资源)、网络图片
但如果要加载网络图片,运行到真机或浏览器必须配置申请网络权限
接下来我们先演示加载本地图片,本地图片一般会放在entry/src/main/resource/base/media文件夹

可以看到,新建完项目后media里已经有一些默认图片了,那么如何显示这里的图片呢?需要用到内置的$r函数
例
Image($r('app.media.startIcon'))startIcon.png这张图片了,注意:不用加后缀app.media即代表找到media文件夹,后面就填这个文件夹内的图片名即可效果如下

但此时发现,图片铺满了屏幕。原因是在ArkUI的所有组件里,如果不给宽高默认会以内容作为最终宽高,因此Image没给宽高会用图片实际宽高作为Image的宽高,而这张图片过大,所以撑满屏幕都还没显示完
继续设置宽高后则正常

我们再试试让Image加载网络图片
Image('https://www-file.huawei.com/-/media/corporate/images/home/logo/huawei_logo.png')
.width(100)
发现,仅仅只需要在Image里传入图片网址字符串即可
但是这时候有同学疑惑了:你这个老哔登,之前不是说要申请网络权限吗?咋这会不需要了?

如果你是如此质疑我,我表示:质疑的好!说明你们刚刚认真学习了!但是要注意:我说的是真机或模拟器运行时需要申请网络权限,而现在我们仅仅只是预览,所以能看到。
P.S:其实在之前的DevEco中,即是是预览也要配置网络权限,但是在Preview版后,华为为了方便大家快速做布局看效果,让大家预览器界面也能直接看到网络图片
关于如何申请网络权限,后面再讲
文本输入框
作用:专门用来让用户进行输入的
语法
TextInput( { placeholder: '占位符', text: '默认值' } )
常用属性:
按钮组件
作用:让用户点击或者触摸
语法
Button('按钮名')默认情况下依然是内容撑开,所以一般Button需要给宽高

我们发现,默认情况下Button是胶囊型的(也即有圆角),如果不喜欢还可以设置样式
属性
type:设置按钮样式,当按钮宽100的情况下,三种样式如下
ButtonType.Capsule: 默认值,胶囊型

ButtonType.Circle: 默认值,圆形

ButtonType.Normal: 普通型,就是没圆角

DevEco介绍
DevEco下载与安装
DevEco新建项目后,目前写代码的地方在?
entry->src->main->ets->pages放图片的地方在哪?
entry/src/main/resource/base/media布局页面的代码写在哪个函数内?
基础组件
Text
Column:
布局组件,能让子组件从上到下布局(沿着y轴布局)
如果要自主设置子组件的间距,可以传入space
Column({ space: 间距数 })属性有
justifyContent:设置子组件在主轴的排列方式
alignItems: 设置子组件在交叉轴排列方式(用在Column代表设置水平方向)
Row:
布局组件,能让子组件从左到右布局(沿着x轴布局)
如果要自主设置子组件的间距,可以传入space
Row({ space: 间距数 })属性方法有
justifyContent:设置子组件在主轴的排列方式
alignItems: 设置子组件在交叉轴排列方式(用在Row代表设置垂直方向)
Image组件
显示一张图片
可以显示本地也可以显示网络
真机或模拟器运行,显示网络图片需要申请权限
用$r加载本地图片
TextInput组件
输入框
可以传入placeholder属性设置占位符,也可以用text属性绑定输入内容
type属性方法修改输入框类型
InputType.Normal:默认值,普通文本输入框
InputType.Password:密码输入框
InputType.Email: 邮箱地址输入模式
InputType.Number: 纯数字输入模式。
InputType.PhoneNumber:电话号码输入模式。
Button组件
单选题
需要在主轴上使第一个元素到行首的距离和最后一个元素到行尾的距离是相邻元素之间距离的一半,通过下列那种方式设置?
A. justifyContent(FlexAlign.SpaceBetween)
B. justifyContent(FlexAlign.SpaceAround)
C. justifyContent(FlexAlign.SpaceEvenly)
D. justifyContent(FlexAlign.Center)
当开发者需要使用TextInput完成一个密码输入框,推荐设置type属性方法为下面哪个值?
A. InputType.Normal
B. InputType.Password
C. InputType.Email
D. InputType.Number
Image如果要加载entry/src/main/resource/base/media/my.png这张图片,下面哪种写法是对的?
A. $r('my.png')
B. $r('app.media.my.png')
C. $r('app.media.my')
D. $r('media.my')
多选题
下面哪些属于属性方法?
A. fontSize() B. onClick() C. width() D. height()
判断题
扩展练习题
利用今天所学制作一个界面,要求如图

- 提示:可以把今天所学的组件全用上,建议分析界面先确定整体大容器,由外而内