0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenHarmony应用场景 鸿蒙智能家居【1.0】

ArkUI详解 来源:鸿蒙实验室 作者:鸿蒙实验室 2022-07-13 09:24 次阅读

应用场景:

智能家居

今天打造的这一款全新智能家庭控制系统,凸显应用在智能控制和用户体验的特点,开创国内智能家居系统体验新局面。新的系统主要应用在鸿蒙生态。

在开始之前大家可以先预览一下我完成之后的效果。

智能家居中控

是不是很炫酷呢?

搭建OpenHarmony环境

完成本篇Codelab我们首先要完成开发环境的搭建,本示例以DaYu200开发板为例,参照以下步骤进行:

获取OpenHarmony系统版本:标准系统解决方案(二进制)

以3.0版本为例:

img

搭建烧录环境

完成DevEco Device Tool的安装

完成Dayu200开发板的烧录

搭建开发环境

开始前请参考工具准备 ,完成DevEco Studio的安装和开发环境配置。

开发环境配置完成后,请参考使用工程向导 创建工程(模板选择“Empty Ability”),选择eTS语言开发。

工程创建完成后,选择使用真机进行调测 。

相关概念

容器组件

Column

Row

Stack

基础组件

Text

TextInput

Button

Image

Navigation

通用

边框设置

尺寸设置

点击控制

布局约束

背景设置

点击事件

TS语法糖

好的接下来我将详细讲解如何制作

开发教学

创建好的 eTS工程目录

新建工程的ETS目录如下图所示。

img

各个文件夹和文件的作用:

index.ets:用于描述UI布局、样式、事件交互和页面逻辑。

app.ets:用于全局应用逻辑和应用生命周期管理。

pages:用于存放所有组件页面。

resources:用于存放资源配置文件。

接下来开始正文。

我们的主要操作都是在在pages目录中,然后我将用不到10分钟的时间,带大家实现这个功能。

拆解

image-20220706230542588

根据设计图,我们可以分层展示,用Column包裹,大致分为这几步

image-20220706231016908

可以看下本页的结构:

image-20220706232242915

再详细一点:

image-20220706232343167

import

{

SettingDetails

}

from

'./common/SettingDetails'

;

import

router

from

'@ohos.router'

;

@

Entry

@

Component

struct

Index

{

@

State

title

:

string

=

'智能家居体验'

@

State

message

:

string

=

'你现在想要打开那些设置?'

@

State

desc

:

string

=

'点击所有适用的选项。这将帮助我们\n自定义您的主页'

@

State

Number

:

String

[]

=

[

'0'

,

'1'

,

'2'

,

'3'

,

'4'

]

@

State

private

isSelect

:

boolean

=

true

;

build

() {

Column

() {

Text

(

this

.

title

)

.

fontSize

(

80

)

.

fontWeight

(

FontWeight

.

Bold

).

onClick

(()

=>

{

router

.

push

({

url

:

'pages/SensorScreen'

})

}).

margin

({

bottom

:

60

,

top

:

40

})

Text

(

this

.

message

)

.

fontSize

(

50

)

.

fontWeight

(

FontWeight

.

Bold

).

onClick

(()

=>

{

router

.

push

({

url

:

'pages/SensorScreen'

})

}).

margin

({

bottom

:

60

})

Text

(

this

.

desc

)

.

fontSize

(

30

)

.

textAlign

(

TextAlign

.

Center

)

.

fontWeight

(

FontWeight

.

Bold

)

.

onClick

(()

=>

{

})

.

margin

({

bottom

:

60

})

Row

() {

SettingDetails

({

image

:

"common/images/setting.png"

,

title

:

"Maintenance\nRequests"

,

isSelected

:

this

.

isSelect

!

})

SettingDetails

({

image

:

"common/images/grain.png"

,

title

:

"Integrations\n"

,

isSelected

:

this

.

isSelect

!

})

SettingDetails

({

image

:

"common/images/ic_highlight.png"

,

title

:

"Light\nControl"

,

isSelected

:

this

.

isSelect

!

})

}

Row

() {

SettingDetails

({

image

:

"common/images/opacity.png"

,

title

:

"Leak\nDetector"

,

isSelected

:

this

.

isSelect

!

})

SettingDetails

({

image

:

"common/images/ac_unit.png"

,

title

:

"Temperature\nControl"

,

isSelected

:

this

.

isSelect

!

})

SettingDetails

({

image

:

"common/images/key.png"

,

title

:

"Guest\nAccess"

,

isSelected

:

this

.

isSelect

!

})

}

Button

(

"NEXT"

)

.

fontSize

(

60

)

.

fontColor

(

Color

.

Black

)

.

width

(

600

)

.

height

(

100

)

.

backgroundColor

(

Color

.

Red

)

.

margin

({

top

:

100

})

.

onClick

(()

=>

{

router

.

push

({

url

:

'pages/SensorScreen'

})

})

}

.

width

(

'100%'

)

.

height

(

'100%'

).

backgroundColor

(

"#F5F5F5"

)

}

}

具体布局

具体布局设计到一些细节的地方,例如间隔,边框,当前组件尺寸设置等一些特殊情况,基本上就是嵌套,一层一层去实现。

代码结构

image-20220706231113785

编码

Index.ets

import

{

SettingDetails

}

from

'./common/SettingDetails'

;

import

router

from

'@ohos.router'

;

@

Entry

@

Component

struct

Index

{

@

State

title

:

string

=

'智能家居体验'

@

State

message

:

string

=

'你现在想要打开那些设置?'

@

State

desc

:

string

=

'点击所有适用的选项。这将帮助我们\n自定义您的主页'

@

State

Number

:

String

[]

=

[

'0'

,

'1'

,

'2'

,

'3'

,

'4'

]

@

State

private

isSelect

:

boolean

=

true

;

build

() {

Column

() {

Text

(

this

.

title

)

.

fontSize

(

80

)

.

fontWeight

(

FontWeight

.

Bold

).

onClick

(()

=>

{

router

.

push

({

url

:

'pages/SensorScreen'

})

}).

margin

({

bottom

:

60

,

top

:

40

})

Text

(

this

.

message

)

.

fontSize

(

50

)

.

fontWeight

(

FontWeight

.

Bold

).

onClick

(()

=>

{

router

.

push

({

url

:

'pages/SensorScreen'

})

}).

margin

({

bottom

:

60

})

Text

(

this

.

desc

)

.

fontSize

(

30

)

.

textAlign

(

TextAlign

.

Center

)

.

fontWeight

(

FontWeight

.

Bold

)

.

onClick

(()

=>

{

})

.

margin

({

bottom

:

60

})

Row

() {

SettingDetails

({

image

:

"common/images/setting.png"

,

title

:

"Maintenance\nRequests"

,

isSelected

:

this

.

isSelect

!

})

SettingDetails

({

image

:

"common/images/grain.png"

,

title

:

"Integrations\n"

,

isSelected

:

this

.

isSelect

!

})

SettingDetails

({

image

:

"common/images/ic_highlight.png"

,

title

:

"Light\nControl"

,

isSelected

:

this

.

isSelect

!

})

}

Row

() {

SettingDetails

({

image

:

"common/images/opacity.png"

,

title

:

"Leak\nDetector"

,

isSelected

:

this

.

isSelect

!

})

SettingDetails

({

image

:

"common/images/ac_unit.png"

,

title

:

"Temperature\nControl"

,

isSelected

:

this

.

isSelect

!

})

SettingDetails

({

image

:

"common/images/key.png"

,

title

:

"Guest\nAccess"

,

isSelected

:

this

.

isSelect

!

})

}

Button

(

"NEXT"

)

.

fontSize

(

60

)

.

fontColor

(

Color

.

Black

)

.

width

(

600

)

.

height

(

100

)

.

backgroundColor

(

Color

.

Red

)

.

margin

({

top

:

100

})

.

onClick

(()

=>

{

router

.

push

({

url

:

'pages/SensorScreen'

})

})

}

.

width

(

'100%'

)

.

height

(

'100%'

).

backgroundColor

(

"#F5F5F5"

)

}

}

image-20220706230620896

针对这一页:首先是头部

image-20220706232459401

代码如下:

Row() {

Image($r("app.media.logo"))

.objectFit(ImageFit.Contain)

.width(200)

.height(200)

.borderRadius(21)

Column() {

Text('June 14, 2022')

.fontSize(40).opacity(0.4)

.fontWeight(FontWeight.Bold)

Text('Good Morning,\nJianGuo',)

.fontSize(60)

.fontWeight(FontWeight.Bold)

}

}

其次是个人信息,包括头像等信息:

image-20220706232621793

代码如下:

接下来就是温度和湿度

image-20220706232715798

代码如下:

ow

({

space

:

120

}) {

Column

() {

Text

(

'40°'

,)

.

fontSize

(

40

).

opacity

(

0.4

)

.

fontWeight

(

FontWeight

.

Bold

)

Text

(

'TEMPERATURE'

,)

.

fontSize

(

40

).

opacity

(

0.4

)

}.

margin

({

left

:

60

})

Column

() {

Text

(

'59%'

,)

.

fontSize

(

40

).

opacity

(

0.4

)

.

fontWeight

(

FontWeight

.

Bold

)

Text

(

'HUMIDITY'

,)

.

fontSize

(

40

).

opacity

(

0.4

)

}.

margin

({

right

:

60

})

}.

margin

({

top

:

20

})

SensorScreen.ets

import

{

HomeDetails

}

from

'./common/homedetails'

;

// second.ets

import

router

from

'@ohos.router'

;

@

Entry

@

Component

struct

Second

{

@

State

message

:

string

=

'Hi there'

@

State

private

isSelect

:

boolean

=

true

;

build

() {

Column

() {

Row

() {

Image

(

$r

(

"app.media.back"

))

.

objectFit

(

ImageFit

.

Contain

)

.

width

(

80

)

.

height

(

80

)

.

onClick

(()

=>

{

router

.

back

()

})

Blank

()

Text

(

'Home'

)

.

fontSize

(

45

)

.

fontWeight

(

FontWeight

.

Bold

)

Blank

()

Image

(

$r

(

"app.media.notifications_none"

))

.

objectFit

(

ImageFit

.

Contain

)

.

width

(

80

)

.

height

(

80

)

.

onClick

(()

=>

{

router

.

back

()

})

}

.

width

(

'100%'

)

Row

() {

Image

(

$r

(

"app.media.logo"

))

.

objectFit

(

ImageFit

.

Contain

)

.

width

(

200

)

.

height

(

200

)

.

borderRadius

(

21

)

Column

() {

Text

(

'June 14, 2022'

)

.

fontSize

(

40

).

opacity

(

0.4

)

.

fontWeight

(

FontWeight

.

Bold

)

Text

(

'Good Morning,\nJianGuo'

,)

.

fontSize

(

60

)

.

fontWeight

(

FontWeight

.

Bold

)

}

}

Row

({

space

:

120

}) {

Column

() {

Text

(

'40°'

,)

.

fontSize

(

40

).

opacity

(

0.4

)

.

fontWeight

(

FontWeight

.

Bold

)

Text

(

'TEMPERATURE'

,)

.

fontSize

(

40

).

opacity

(

0.4

)

}.

margin

({

left

:

60

})

Column

() {

Text

(

'59%'

,)

.

fontSize

(

40

).

opacity

(

0.4

)

.

fontWeight

(

FontWeight

.

Bold

)

Text

(

'HUMIDITY'

,)

.

fontSize

(

40

).

opacity

(

0.4

)

}.

margin

({

right

:

60

})

}.

margin

({

top

:

20

})

Row

() {

HomeDetails

({})

HomeDetails

({

image

:

"common/images/lightbull.png"

,

isSelected

:

this

.

isSelect

!

})

}

Row

() {

HomeDetails

({

image

:

"common/images/opacity.png"

})

HomeDetails

({

image

:

"common/images/yytem0.png"

})

}

Row

(){

Column

(){

Text

(

'ADD'

,)

.

fontSize

(

40

).

opacity

(

0.4

)

.

fontWeight

(

FontWeight

.

Bold

)

Text

(

'NEW CONTROL'

,)

.

fontSize

(

40

).

opacity

(

0.4

)

}

Blank

()

Image

(

$r

(

"app.media.add"

))

.

objectFit

(

ImageFit

.

Contain

)

.

width

(

100

)

.

height

(

100

)

.

borderRadius

(

21

).

margin

({

right

:

40

})

}.

border

({

color

:

Color

.

White

,

width

:

8

,

radius

:

20

}).

width

(

"88%"

).

height

(

150

)

}.

width

(

"100%"

)

.

height

(

'100%'

).

backgroundColor

(

"#F5F5F5"

)

}

}

我们可以对,下面的这块进行封装

image-20220706231310224

代码如下

@

Entry

@

Component

export

struct

SettingDetails

{

@

State

private

image

:

string

=

"common/images/setting.png"

@

State

private

title

:

string

=

"Maintenance\nRequests"

@

State

private

isSelected

:

boolean

=

true

;

build

() {

Column

() {

Image

(

this

.

image

)

.

objectFit

(

ImageFit

.

Contain

)

.

width

(

140

)

.

height

(

120

)

.

margin

(

20

)

.

border

({

width

:

12

,

color

:

this

.

isSelected

?

Color

.

White

:

Color

.

Red

,

radius

:

20

})

.

onClick

(()

=>

{

this

.

isSelected

=

!

this

.

isSelected

;

})

Text

(

this

.

title

).

fontSize

(

32

).

width

(

200

).

textAlign

(

TextAlign

.

Center

)

}

}}

我们可以对,下面的这块进行封装

image-20220706231425068image-20220706232810459

代码如下

@

Entry

@

Component

export

struct

SettingDetails

{

@

State

private

image

:

string

=

"common/images/setting.png"

@

State

private

title

:

string

=

"Maintenance\nRequests"

@

State

private

isSelected

:

boolean

=

true

;

build

() {

Column

() {

Image

(

this

.

image

)

.

objectFit

(

ImageFit

.

Contain

)

.

width

(

140

)

.

height

(

120

)

.

margin

(

20

)

.

border

({

width

:

12

,

color

:

this

.

isSelected

?

Color

.

White

:

Color

.

Red

,

radius

:

20

})

.

onClick

(()

=>

{

this

.

isSelected

=

!

this

.

isSelected

;

})

Text

(

this

.

title

).

fontSize

(

32

).

width

(

200

).

textAlign

(

TextAlign

.

Center

)

}

}}

最后就是底部

image-20220706232904753

代码如下:

Row(){

Column(){

Text('ADD',)

.fontSize(40).opacity(0.4)

.fontWeight(FontWeight.Bold)

Text('NEW CONTROL',)

.fontSize(40).opacity(0.4)

}

Blank()

Image($r("app.media.add"))

.objectFit(ImageFit.Contain)

.width(100)

.height(100)

.borderRadius(21).margin({right:40})

}.border({

color:Color.White,

width:8,

radius:20

}).width("88%").height(150)

恭喜你

在本文中,通过实现智联汽车App示例,我主要为大家讲解了如下ArkUI(基于TS扩展的类Web开发范式)组件,以及路由跳转。

容器组件

Column

Row

Stack

基础组件

Text

Button

Image

Navigation

通用

边框设置

尺寸设置

点击控制

布局约束

背景设置

点击事件

TS语法糖

希望通过本教程,各位开发者可以对以上基础组件具有更深刻的认识。

后面的计划:

智能互联

硬件交互

动画交互

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 智能家居
    +关注

    关注

    1928

    文章

    9559

    浏览量

    185053
  • HarmonyOS
    +关注

    关注

    79

    文章

    1974

    浏览量

    30168
  • OpenHarmony
    +关注

    关注

    25

    文章

    3720

    浏览量

    16297
收藏 人收藏

    评论

    相关推荐

    NanoEdge AI的技术原理、应用场景及优势

    硬件设计则是为了确保设备在执行这些任务时能够保持低能耗,从而提高其续航能力。 2、应用场景 NanoEdge AI 可以广泛应用于各种物联网设备和传感器,如智能家居、工业自动化、智能交通、医疗健康
    发表于 03-12 08:09

    #硬声创作季 #某些喜欢 #智能家居智能家居角度看鸿蒙 #鸿蒙

    智能家居鸿蒙
    Hello,World!
    发布于 :2022年11月02日 11:36:24

    智能摄像机 引领智能家居潮流

    直至如今,整个市场还没有一家能够形成较大的规模。之所以他们还难以实现市场规模化的成绩,进而代表他们身处品类带动整个智能家居行业的发展,和他们的产品应用场景与应用频率还不够高有着很大关系。与之相比,近期
    发表于 12-28 17:33

    选择智能家居的几点理由?

    。2.便利随着物联网、云计算、无线通信等新技术的发展,智能家居得到了快速发展更大的方便了人们的生活。智能家居能让用户利用智能手机来控制家中的设备,实现远程控制、场景控制、联动控制和定时
    发表于 01-30 16:45

    未来智能家居场景分哪种类型?

    升至2018年的约4.9亿部,其中运动监测、移动医疗、智能手表类将成为最主要的可穿戴产品形态。   随着科学技术发展,人们生活的场景类型可能不会大幅增加,但切换变化却只会更频繁,随之适应人们使用习惯的LivingLab智能家居
    发表于 02-01 14:51

    迈入智能场景时代!2018年智能家居能否迎来爆点时刻?

    去年,智能门锁和智能音箱作为智能家居领域的两个热销产品横空出世。同期,智能家居企业关注的重点由单品转入到了智能
    发表于 04-17 13:38

    选择智能家居的几点理由。

    的发展,智能家居得到了快速发展更大的方便了人们的生活。智能家居能让用户利用智能手机来控制家中的设备,实现远程控制、场景控制、联动控制和定时控制等功能。红外线遥控开关通过远程控制,用户可
    发表于 04-18 15:51

    【HarmonyOS HiSpark Wi-Fi IoT HarmonyOS 智能家居套件试用 】金典智能家居

    项目名称:金典智能家居试用计划:申请理由本人在智能家居领域有5年多的学习和开发经验,曾参与金典智能家居产品的开发,产品包括门锁,加湿器,智能灯等,产品支持过近程远程协议,wifi,蓝牙
    发表于 09-25 10:09

    【HarmonyOS HiSpark Wi-Fi IoT HarmonyOS 智能家居套件试用 】基于鸿蒙OS系统的智能家居智能安防系统

    项目名称:基于鸿蒙OS系统的智能家居智能安防系统试用计划:申请理由本人在嵌入式开发领域有7年多的学习和开发经验,并且从业以来一直从事智能家居类产品的开发,曾设计基于zigbee协议的
    发表于 10-29 14:33

    【HarmonyOS HiSpark Wi-Fi IoT HarmonyOS 智能家居套件试用 】智能家居项目

    项目名称:智能家居项目试用计划:本人基于兴趣爱好,具有飞凌、瑞芯微、全志开发板学习和开发经验,成功移植、调试安装。具有全志、瑞芯微智能芯片开发能力。想借助发烧友论坛和参与鸿蒙硬件的学习和设计。项目
    发表于 10-29 14:46

    【HarmonyOS HiSpark Wi-Fi IoT HarmonyOS 智能家居套件试用 】智能家庭

    项目名称:智能家庭试用计划:探索鸿蒙智能家居方面的应用场景和效果
    发表于 10-29 15:13

    智能家居的应用研究现状 精选资料分享

    电子设备发展快。智能家居的四大应用场景智能家电、家用安防、照明系统和连接控制设备。物联网技术是智能家居的基础,家...
    发表于 07-19 09:08

    【直播回顾】OpenHarmony知识赋能六期第一课—OpenHarmony智能家居项目介绍

    6月16日晚上19点,知识赋能第六期第一节课 《OpenHarmony智能家居项目介绍》 ,在OpenHarmony开发者成长计划社群内成功举行。本次直播是“OpenHarmony开源
    发表于 06-17 11:08

    中软国际智能家居中控屏通过OpenHarmony兼容性测评

    ,获颁OpenHarmony生态产品兼容性证书。 家居中控屏是智能家居场景的控制中心,也是智慧家居解决方案中人与设备间沟通的重要桥梁,此次
    的头像 发表于 12-26 20:20 1434次阅读

    什么是Matter 1.0?它将如何颠覆智能家居

    什么是Matter 1.0?它将如何颠覆智能家居
    的头像 发表于 11-28 17:25 756次阅读
    什么是Matter <b class='flag-5'>1.0</b>?它将如何颠覆<b class='flag-5'>智能家居</b>?