即墨网站优化,兰州自媒体公司有哪些,中国互联网上市公司排名,网页公正流程【HarmonyOS】鸿蒙应用实现手机摇一摇功能
一、前言
手机摇一摇功能#xff0c;是通过获取手机设备#xff0c;加速度传感器接口#xff0c;获取其中的数值#xff0c;进行逻辑判断实现的功能。
在鸿蒙中手机设备传感器ohos.sensor (传感器)的系统API监听有以下#xf…【HarmonyOS】鸿蒙应用实现手机摇一摇功能
一、前言
手机摇一摇功能是通过获取手机设备加速度传感器接口获取其中的数值进行逻辑判断实现的功能。
在鸿蒙中手机设备传感器ohos.sensor (传感器)的系统API监听有以下 ohos.sensor (传感器)官网API
加速度传感器环境光传感器气压计传感器重力传感器陀螺仪传感器霍尔传感器心率传感器湿度传感器线性加速度传感器地磁传感器方向传感器计步器传感器接近光传感器旋转矢量传感器大幅动作检测传感器佩戴检测传感器
其中摇一摇用到的加速度传感器是多个维度测算的是指x、y、z三个方向上的加速度值。 主要测算一些瞬时加速或减速的动作。比如测量手机的运动速度和方向。
当用户拿着手机运动时会出现上下摆动的情况这样可以检测出加速度在某个方向上来回改变通过检测这个来回改变的次数可以计算出步数。
在游戏里能通过加速度传感器触发特殊指令。日常应用中的一些甩动切歌、翻转静音等也都用到了这枚传感器。
注意 至于为什么不用线性加速传感器是因为线性加速度传感器和加速度传感器在定义、工作原理以及应用场景上存在显著的区别。线性主要是来检测物体在直线方向上的位移。
二、功能开发思路
1.根据通过ohos.sensor接口获取加速度传感器的数值添加权限ohos.permission.ACCELEROMETER {name: ohos.permission.ACCELEROMETER,reason: $string:reason,usedScene: {abilities: [EntryAbility],when: always}}sensor.on(sensor.SensorId.ACCELEROMETER, (data: sensor.AccelerometerResponse) {}, { interval: 100000000 }); // 设置间隔为100000000 ns 0.1 s2.将xyz三个方向的数值进行绝对值处理获取运动数值 sensor.on(sensor.SensorId.ACCELEROMETER, (data: sensor.AccelerometerResponse) {console.info(this.TAG, Succeeded in invoking on. X-coordinate component: data.x);console.info(this.TAG,Succeeded in invoking on. Y-coordinate component: data.y);console.info(this.TAG,Succeeded in invoking on. Z-coordinate component: data.z);}, { interval: 100000000 }); // 设置间隔为100000000 ns 0.1 s3.根据运动数值进行判断是否符合摇一摇的运动区间 let x Math.abs(data.x);let y Math.abs(data.y);let z Math.abs(data.z);this.message x : x y: y z: z;if(x this.SWING_VAL || y this.SWING_VAL || z this.SWING_VAL){promptAction.showToast({message: 手机正在摇一摇})}最后一步当然就是使用手机设备进行代码功能效果的验证。 若没有真机设备使用模拟器点击该按钮可实现摇一摇手机的触发。 注意 不使用加速传感器时一定要移除监听。否则会白白损耗性能。
三、源码示例 import { sensor } from kit.SensorServiceKit;
import { BusinessError } from kit.BasicServicesKit;
import { promptAction } from kit.ArkUI;Entry
Component
struct SensorTestPage {private TAG: string SenorTestPage;private SWING_VAL: number 50;State message: string ;aboutToAppear(): void {try {// 订阅加速度传感器返回的数据sensor.on(sensor.SensorId.ACCELEROMETER, (data: sensor.AccelerometerResponse) {console.info(this.TAG, Succeeded in invoking on. X-coordinate component: data.x);console.info(this.TAG,Succeeded in invoking on. Y-coordinate component: data.y);console.info(this.TAG,Succeeded in invoking on. Z-coordinate component: data.z);let x Math.abs(data.x);let y Math.abs(data.y);let z Math.abs(data.z);this.message x : x y: y z: z;if(x this.SWING_VAL || y this.SWING_VAL || z this.SWING_VAL){promptAction.showToast({message: 手机正在摇一摇})}}, { interval: 100000000 }); // 设置间隔为100000000 ns 0.1 s} catch (error) {let e: BusinessError error as BusinessError;console.error(this.TAG, Failed to invoke on. Code: ${e.code}, message: ${e.message});}}aboutToDisappear(): void {sensor.off(sensor.SensorId.ACCELEROMETER);}build() {RelativeContainer() {Text(this.message).id(SenorTestPageHelloWorld).fontSize(50).fontWeight(FontWeight.Bold).alignRules({center: { anchor: __container__, align: VerticalAlign.Center },middle: { anchor: __container__, align: HorizontalAlign.Center }})}.height(100%).width(100%)}
}注意 记得添加ohos.permission.ACCELEROMETER权限否则无法监听到加速传感器