鸿蒙NEXT开发案例:光强仪

【引言】
本文将介绍如何使用鸿蒙NEXT框架开发一个简单的光强仪应用,该应用能够实时监测环境光强度,并给出相应的场景描述和活动建议。
【环境准备】
电脑系统:windows 10
开发工具:DevEco Studio NEXT Beta1 Build Version: 5.0.3.806
工程版本:API 12
真机:mate60 pro
语言:ArkTS、ArkUI
【功能实现】
1. 项目结构
本项目主要由以下几个部分组成:
- LightIntensityItem 类:用于定义光强度范围及其相关信息,包括光强度的起始值、终止值、类型、描述和建议活动。通过构造函数初始化这些属性,便于后续使用。
- LightIntensityMeter 组件:这是光强仪的核心,包含状态管理、传感器初始化和光强度更新等功能。组件使用
@State装饰器来管理当前光强度值和类型,并在组件即将出现时获取传感器列表。 - 传感器数据处理:通过监听环境光传感器的数据,实时更新当前光强度值,并根据光强度范围更新当前类型。这一过程确保了用户能够获得最新的环境光信息。
2. 界面布局
光强仪的用户界面使用了鸿蒙系统的布局组件,包括 Column 和 Row。界面展示了当前光强度值和类型,并通过仪表组件直观地显示光强度。用户可以清晰地看到光强度的变化,并获得相应的场景描述和活动建议。
- 仪表组件:用于显示当前光强度值,采用了动态更新的方式,确保用户能够实时看到光强度的变化。
- 信息展示:通过遍历光强度范围列表,展示每个类型的光强度范围、描述和建议活动。这一部分为用户提供了实用的信息,帮助他们根据环境光条件做出相应的决策。
3. 总结
通过本案例,开发者可以学习到如何在鸿蒙系统中使用传感器服务和组件化开发方式,构建一个功能完整的光强仪应用。该应用不仅能够实时监测光强度,还能根据不同的光强度范围提供实用的建议,提升用户体验。
【完整代码】
import { sensor } from '@kit.SensorServiceKit'; // 导入传感器服务套件
import { BusinessError } from '@kit.BasicServicesKit'; // 导入业务错误类
// 定义一个光强度项类,用于存储不同光强度范围的信息
class LightIntensityItem {
luxStart: number; // 光感强度范围起点
luxEnd: number; // 光感强度范围终点
type: string; // 类型
description: string; // 场景描述
recommendation: string; // 建议活动
// 构造函数,初始化对象属性
constructor(luxStart: number, luxEnd: number, type: string, description: string, recommendation: string) {
this.luxStart = luxStart;
this.luxEnd = luxEnd;
this.type = type;
this.description = description;
this.recommendation = recommendation;
}
}
// 使用装饰器定义组件,该组件是光强度计
@Entry
@Component
struct LightIntensityMeter {
@State currentType: string = ""; // 当前光强度类型
@State currentIntensity: number = 0; // 当前光强度值
@State lightIntensityList: LightIntensityItem[] = [// 不同光强度范围的列表
new LightIntensityItem(0, 1, '极暗', '夜晚户外,几乎没有光源。', '不宜进行任何活动,适合完全休息。'),
new LightIntensityItem(1, 10, '很暗', '夜晚室内,只有微弱的灯光或月光。', '只适合睡觉,避免使用电子设备。'),
new LightIntensityItem(10, 50, '暗', '清晨或傍晚,自然光较弱。', '轻松休闲,避免长时间阅读,适合放松。'),
new LightIntensityItem(50, 100, '较暗', '白天阴天,室内光线柔和。', '日常生活,短时间阅读,适合轻度活动。'),
new LightIntensityItem(100, 300, '适中', '白天多云,室内光线适中。', '工作学习,适度阅读,适合大部分室内活动。'),
new LightIntensityItem(300, 500, '较亮', '白天晴朗,室内光线充足。', '正常工作学习,长时间阅读,适合大部分活动。'),
new LightIntensityItem(500, 1000, '亮', '阴天室外,自然光较强。', '户外活动,注意防晒,适合户外休闲。'),
new LightIntensityItem(1000, 100000, '爆表了', '夏季正午直射阳光,自然光极其强烈。',
'尽可能避免直视太阳,户外活动需戴太阳镜,注意防晒。'),
];
// 当组件即将出现时调用的方法
aboutToAppear(): void {
sensor.getSensorList((error: BusinessError) => { // 获取传感器列表
if (error) { // 如果有错误
console.error('获取传感器列表失败', error); // 打印错误信息
return;
}
this.startLightIntensityUpdates(); // 没有错误则开始监听光强度变化
});
}
// 开始监听环境光传感器的数据
private startLightIntensityUpdates(): void {
sensor.on(sensor.SensorId.AMBIENT_LIGHT, (data) => { // 监听环境光传感器
console.info(`data.intensity: ${data.intensity}`); // 打印光强度值
this.currentIntensity = data.intensity; // 更新当前光强度值
for (const item of this.lightIntensityList) { // 遍历光强度列表
if (data.intensity >= item.luxStart && data.intensity <= item.luxEnd) { // 判断当前光强度属于哪个范围
this.currentType = item.type; // 更新当前光强度类型
break;
}
}
}, { interval: 10000000 }); // 设置传感器更新间隔,单位为纳秒(10000000纳秒=1秒)
}
// 组件构建方法
build() {
Column() { // 创建一个垂直布局容器
Text("光强仪")// 显示标题
.width('100%')// 设置宽度为100%
.height(44)// 设置高度为44
.backgroundColor("#fe9900")// 设置背景颜色
.textAlign(TextAlign.Center)// 设置文本对齐方式为中心
.fontColor(Color.White); // 设置字体颜色为白色
Row() { // 创建一个水平布局容器
Gauge({
// 创建一个仪表组件
value: this.currentIntensity > 1000 ? 1000 : this.currentIntensity, // 设置仪表值
min: 0, // 最小值
max: 1000 // 最大值
}) { // 仪表内部布局
Column() { // 创建一个垂直布局容器
Text(`${Math.floor(this.currentIntensity)}`)// 显示当前光强度值
.fontSize(25)// 设置字体大小
.fontWeight(FontWeight.Medium)// 设置字体粗细
.fontColor("#323232")// 设置字体颜色
.height('30%')// 设置高度为父容器的30%
.textAlign(TextAlign.Center)// 设置文本对齐方式为中心
.margin({ top: '22.2%' })// 设置上边距
.textOverflow({ overflow: TextOverflow.Ellipsis })// 设置文本溢出处理方式
.maxLines(1); // 设置最大行数为1
Text(`${this.currentType}`)// 显示当前光强度类型
.fontSize(16)// 设置字体大小
.fontColor("#848484")// 设置字体颜色
.fontWeight(FontWeight.Regular)// 设置字体粗细
.width('47.4%')// 设置宽度为父容器的47.4%
.height('15%')// 设置高度为父容器的15%
.textAlign(TextAlign.Center)// 设置文本对齐方式为中心
.backgroundColor("#e4e4e4")// 设置背景颜色
.borderRadius(5); // 设置圆角半径
}.width('100%'); // 设置列宽度为100%
}
.startAngle(225) // 设置仪表起始角度
.endAngle(135) // 设置仪表结束角度
.height(250) // 设置仪表高度
.strokeWidth(18) // 设置仪表边框宽度
.description(null) // 设置描述为null
.trackShadow({ radius: 7, offsetX: 7, offsetY: 7 }) // 设置阴影效果
.padding({ top: 30 }); // 设置内边距
}.width('100%').justifyContent(FlexAlign.Center); // 设置行宽度为100%并居中对齐
Column() { // 创建一个垂直布局容器
ForEach(this.lightIntensityList, (item: LightIntensityItem, index: number) => { // 遍历光强度类型数组
Row() { // 创建一个水平布局容器
Text(`${item.luxStart}~${item.luxEnd}Lux `)// 显示每个类型的光强度范围
.fontSize('25lpx')// 设置字体大小
.textAlign(TextAlign.Start)// 设置文本对齐方式为左对齐
.fontColor("#3d3d3d")// 设置字体颜色
.width('220lpx') // 设置宽度
Text(`${item.description}\n${item.recommendation}`)// 显示每个类型的描述和建议活动
.fontSize('23lpx')// 设置字体大小
.textAlign(TextAlign.Start)// 设置文本对齐方式为左对齐
.fontColor("#3d3d3d")// 设置字体颜色
.layoutWeight(1) // 设置布局权重
}.width('660lpx') // 设置行宽度
.padding({ bottom: 10, top: 10 }) // 设置上下内边距
.borderWidth({ bottom: 1 }) // 设置下边框宽度
.borderColor("#737977"); // 设置下边框颜色
});
}.width('100%'); // 设置列宽度为100%
}
.height('100%') // 设置容器高度为100%
.width('100%'); // 设置容器宽度为100%
}
}
鸿蒙NEXT开发案例:光强仪的更多相关文章
- 最全华为鸿蒙 HarmonyOS 开发资料汇总
开发 本示例基于 OpenHarmony 下的 JavaScript UI 框架,进行项目目录解读,JS FA.常用和自定义组件.用户交互.JS 动画的实现,通过本示例可以基本了解和学习到 JavaS ...
- 使用Jquery+EasyUI 进行框架项目开发案例讲解之五 模块(菜单)管理源码分享
http://www.cnblogs.com/huyong/p/3454012.html 使用Jquery+EasyUI 进行框架项目开发案例讲解之五 模块(菜单)管理源码分享 在上四篇文章 ...
- 使用Jquery+EasyUI 进行框架项目开发案例讲解之四 组织机构管理源码分享
http://www.cnblogs.com/huyong/p/3404647.html 在上三篇文章 <使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享> ...
- 使用Jquery+EasyUI 进行框架项目开发案例讲解之三---角色管理源码分享
使用Jquery+EasyUI 进行框架项目开发案例讲解之三 角色管理源码分享 在上两篇文章 <使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享> ...
- 使用Jquery+EasyUI 进行框架项目开发案例讲解之二---用户管理源码分享
使用Jquery+EasyUI 进行框架项目开发案例讲解之二 用户管理源码分享 在上一篇文章<使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享>我们分享 ...
- 【推荐】使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享
使用Jquery+EasyUI 进行框架项目开发案例讲解之一 员工管理源码分享 在开始讲解之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery的U ...
- 使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享
使用Jquery+EasyUI 进行框架项目开发案例解说之中的一个 员工管理源代码分享 在開始解说之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery ...
- 百度UEditor开发案例(JSP)
本案例的开发环境:MyEclipse+tomcat+jdk 本案例的开发内容: 用百度编辑器发布新闻(UEditor的初始化开发部署) 编辑已发过的新闻(UEditor的应用——编辑旧文章) ...
- 使用Jquery+EasyUI 进行框架项目开发案例解说之二---用户管理源代码分享
使用Jquery+EasyUI 进行框架项目开发案例解说之二 用户管理源代码分享 在上一篇文章<使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享> ...
- 使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享
使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享 使用Jquery+EasyUI 进行框架项目开发案例讲解之一 员工管理源码分享 在开始讲解之前,我们先来看一下什 ...
随机推荐
- zabbix 自定义用户key与参数userparameters监控监本输出
zabbix在模板中预定义了一些key,但通常情况,并不能满足我们的需求.幸运的是zabbix提供了自定义key的方法,因此我们可以灵活的监控各种我们想要监控的数据. 定义key有两种修改方式: vi ...
- 倾斜摄影osgb格式文件,进行坐标转换
倾斜摄影OSGB格式的文件,很棘手,今天需要把osgb放到UE中渲染.碰到的问题如下: 1.osgb文件导进去后,Z轴不想上,是歪的,小人放进去后,就斜站在马路上. 2.根本原因是坐标系,UE的插件c ...
- 【工具分享】红队重点资产指纹识别 -- P1finger -0.02(最新版本)
工具介绍: P1finger 红队行动下的重点资产指纹识别工具.P1finger 是一个重点资产指纹识别的工具,旨在通过HTTP请求特征来识别目标系统.其主要特点包括: 语言和实现: 语言:使用Go语 ...
- Java并非锁之独占非公平锁理解
Java锁系列教程之独占式锁 在Java并发编程中,锁是一个很重要的对象.Java中锁有两种:隐式锁和显式锁.使用synchronized关键字的锁是隐式锁.因为锁的申请和释放都是由JVM来维护的,不 ...
- C#自定义控件—仪表盘
C#用户控件之仪表盘 如何让温度.湿度.压力等有量程的监控值如仪表盘(DashBoard)一样显示? 思路(GDI绘图): 定义属性:(仪表盘的半径.颜色.间隙:刻度圆的半径.颜色.字体:指针的颜色. ...
- 6.9找回机制接口安全&验证码token接口
响应包response burp截取拦截,改相应包: 思路:此处应该若是修改密码,先抓到修改成功数据包(截取验证关键字),在替换为需要绕过的数据包,截取response数据包,修改验证成功关键字达到绕 ...
- 苹果(ios)打包证书下载
这里,首先需要明确的是,苹果打包证书不能共用,因此证书下载是只能下载自己的证书,不是去下载别人的证书. 那么自己的证书又是如何生成的呢?去什么地方下载呢?第一次开发ios的同学们,肯定会问这个问题. ...
- JavaScript – Decimal
前言 之前就写过一篇 decimal, double, float, 但有点杂乱, 这篇把 JS 的部分独立写成一篇整理版. 参考 JavaScript 浮点数运算的精度问题 关于JavaScript ...
- LoRaWAN网关价格干穿地板了
废话不多说,不要998,不要688,以太网版本只要398,4G版本只要498. 先上图片 1.1 产品特点 ◆ 高性能嵌入式硬件平台 ◆ 使用工业级 Cat.1 4G 模块 ◆ 宽压输入 DC 9-2 ...
- QT6 Widgets深入剖析
QT6 Widgets深入剖析 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C++扩展开发视频课程 免费QT视频课程 您可以看免费100 ...