鸿蒙NEXT开发案例:光强仪

news/2024/11/17 6:49:29/

【引言】

本文将介绍如何使用鸿蒙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); // 设置最大行数为1Text(`${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%}
}


http://www.ppmy.cn/news/1547662.html

相关文章

hive中数据的粒度级别有哪些?

hive中的数据粒度级别大致分三类&#xff1a;table、partition、bucket 一、表级粒度&#xff08;Table&#xff09; 定义&#xff1a;表级粒度是将整个表作为一个数据单元来考虑。这包括表的整体属性&#xff0c;如存储位置、表的格式&#xff08;如文本格式、ORC 格式、Parqu…

鲸鱼机器人和乐高机器人的比较

鲸鱼机器人和乐高机器人各有其独特的优势和特点&#xff0c;家长在选择时可以根据孩子的年龄、兴趣、经济能力等因素进行综合考虑&#xff0c;选择最适合孩子的教育机器人产品。 优势 鲸鱼机器人 1&#xff09;价格亲民&#xff1a;鲸鱼机器人的产品价格相对乐高更为亲民&…

常见区块链公链的TPS是多少

公链的TPS一直是影响该链能否成为世界级平台的重要参考指标之一&#xff0c;Web2世界里的高并发、高负载已经有很好的解决方案&#xff0c;但至今区块链领域的TPS一直在缓慢前行&#xff0c;这也是阻碍区块链应用快速铺开的重要原因之一。 下面罗列一些常见公链的TPS&#xf…

中文书籍对《人月神话》的引用(161-210本):微软的秘密

中文书籍对《人月神话》的引用&#xff08;第001到160本&#xff09;>> 《人月神话》于1975年出版&#xff0c;1995年出二十周年版。自出版以来&#xff0c;该书被大量的书籍和文章引用&#xff0c;直到现在热潮不退。 2023年&#xff0c;清华大学出版社推出《人月神话》…

QObject中QThreadData里面的postEventList和QObjectPrivate里面的postedEvents

在 Qt 框架中,事件处理是一个核心机制,用于在多线程环境中协调和管理各种事件。QObject 和 QThread 之间的事件传递涉及到 QThreadData 和 QObjectPrivate 中的两个重要成员变量:postEventList 和 postedEvents。下面详细描述这两个成员变量及其作用。 QThreadData::postEv…

14天Java基础学习——第10天:集合框架(基础)

集合框架概述 Java集合框架是一组用于存储和处理对象集合的接口和类。它提供了一种统一的架构来存储和操作数据集合。集合框架的主要优点是它提供了一种统一的接口来处理不同的数据集合&#xff0c;使得数据集合的操作更加简单和方便。 集合框架的主要接口 接口名称描述Coll…

Python_爬虫1_Requests库入门

目录 Requests库 7个主要方法 Requests库的get()方法 Response对象的属性 爬取网页的通用代码框架 理解requests库的异常 HTTP协议及Requests库方法 HTTP协议 HTTP协议采用URL作为定位网络资源的标识。 HTTP协议对资源的操作 理解PATCH和PUT的区别 HTTP协议与Requse…

GSMA eUICC 远程配置架构技术规范笔记 (SGP.02 v3.2)

## GSMA eUICC 远程配置架构技术规范笔记 (SGP.02 v3.2) ### 1. 概述 **目的&#xff1a;** 为难以接触的机器对机器设备中的嵌入式 UICC (eUICC) 提供远程配置和管理的技术解决方案&#xff0c;确保不同运营商、设备和网络基础设施供应商之间的全球互操作性。 **目标受众&…