【HarmonyOS NEXT】鸿蒙应用实现手机摇一摇功能

简介: 手机摇一摇功能,是通过获取手机设备,加速度传感器接口,获取其中的数值,进行逻辑判断实现的功能。


##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财#

一、前言

手机摇一摇功能,是通过获取手机设备,加速度传感器接口,获取其中的数值,进行逻辑判断实现的功能。

鸿蒙中手机设备传感器@ohos.sensor (传感器)的系统API监听有以下:
@ohos.sensor (传感器)官网API

  1. 加速度传感器
  2. 环境光传感器
  3. 气压计传感器
  4. 重力传感器
  5. 陀螺仪传感器
  6. 霍尔传感器
  7. 心率传感器
  8. 湿度传感器
  9. 线性加速度传感器
  10. 地磁传感器
  11. 方向传感器
  12. 计步器传感器
  13. 接近光传感器
  14. 旋转矢量传感器
  15. 大幅动作检测传感器
  16. 佩戴检测传感器


其中摇一摇用到的,加速度传感器是多个维度测算的,是指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 s

2.将x,y,z三个方向的数值进行绝对值处理,获取运动数值

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 s

3.根据运动数值进行判断,是否符合摇一摇的运动区间

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权限,否则无法监听到加速传感器!

目录
相关文章
|
13天前
|
开发者 容器
鸿蒙应用开发从入门到实战(十四):ArkUI组件Column&Row&线性布局
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解Column和Row组件的使用以及线性布局的方法。
108 12
|
16天前
|
存储 人工智能 算法
鸿蒙HamonyOS应用上架手动签名与发布
鸿蒙HamonyOS应用上架手动签名与发布
69 4
鸿蒙HamonyOS应用上架手动签名与发布
|
14天前
|
API 数据处理
鸿蒙应用开发从入门到实战(十三):ArkUI组件Slider&Progress
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解滑块Slider和进度条Progress组件的使用。
|
19天前
|
JavaScript 开发者 索引
鸿蒙应用开发从入门到实战(九):ArkTS渲染控制
ArkTS拓展了TypeScript,可以结合ArkUI进行渲染控制,是的界面设计具有可编程性。本文简要描述鸿蒙应用开发中的条件渲染和循环渲染。
|
16天前
|
数据安全/隐私保护 开发者
鸿蒙应用开发从入门到实战(十一):ArkUI组件Text&TextInput
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解文本组件Text和TextInput的使用。
110 3
|
14天前
|
API 数据处理
鸿蒙应用开发从入门到实战(十三):ArkUI组件Slider&Progress
ArkUI提供滑块Slider与进度条Progress组件,用于鸿蒙原生APP开发。Slider支持拖动调节音量、亮度等,可设步长、方向及提示气泡;Progress支持线性、环形等多种样式,可自定义颜色、宽度与刻度,实时显示任务进度。
110 2
|
15天前
|
开发者
鸿蒙应用开发从入门到实战(十二):ArkUI组件Button&Toggle
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解按钮组件Button和Toggle的使用。
110 2
|
20天前
|
JavaScript
鸿蒙应用开发从入门到实战(八):ArkTS自定义组件语法
ArkUI除系统预置的组件外,还支持自定义组件。使用自定义组件,可使代码的结构更加清晰,并且能提高代码的复用性。
|
17天前
|
存储 编解码 JSON
鸿蒙应用开发从入门到实战(十):ArkUI图片组件Image
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解Image图片组件的使用。
126 1
|
21天前
|
API
鸿蒙应用开发从入门到实战(七):ArkTS组件声明语法
《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容、欢迎关注!​本文从界面制作从组件声明开始,通过一个相对简单的案例来系统的学习 ArkTS 声明组件的语法。