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

目录
相关文章
|
缓存 数据安全/隐私保护 JavaScript
【HarmonyOS 5】鸿蒙页面和组件生命周期函数
【HarmonyOS 5】鸿蒙页面和组件生命周期函数
154 0
|
3月前
|
物联网 开发工具
【HarmonyOS】鸿蒙应用蓝牙功能实现 (二)
【HarmonyOS】鸿蒙应用蓝牙功能实现 (二)
112 9
【HarmonyOS】鸿蒙应用蓝牙功能实现 (二)
|
3月前
|
开发工具
【HarmonyOS 5】使用openCustomDialog如何禁止手势关闭的方案
openCustomDialog提供了onWillDismiss回调函数,当用户尝试通过滑动、点击外部、返回键等操作关闭弹窗时,会触发该回调。通过在回调中判断关闭原因并拦截操作,即可实现禁止手势关闭的效果。
106 1
|
3月前
|
前端开发 JavaScript API
【HarmonyOS 5】鸿蒙跨平台开发方案详解(一)
2025年是鸿蒙生态迎来关键发展期。根据前几天的2025 HDC数据显示,鸿蒙原生应用数量已从2024年的2000款增长至5000款,微信鸿蒙版安装量突破1.2亿,公安部交管系统完成全国300城鸿蒙适配。
266 1
|
3月前
|
存储 安全 API
【HarmonyOS 5】鸿蒙应用隐私保护详解
【HarmonyOS 5】鸿蒙应用隐私保护详解
143 1
|
3月前
|
传感器 安全 物联网
【HarmonyOS 5】鸿蒙分布式协同应用开发详解
为什么需要分布式协同应用? 首先是因为当今社会,围绕电子产品生态,人们迫切希望,周边的电子设备可以协同操作。例如手机,手表,电视机,汽车,甚至是各种家电产品。 从2015年到如今,手机和pc等老牌电子产品的设备数趋于稳定,其他IoT设备稳步增长。可见人均所拥有的的电子产品的个数,在迅速增加。
150 0
|
3月前
|
人工智能 自然语言处理 IDE
【HarmonyOS 5】鸿蒙CodeGenie AI辅助编程工具详解
1、CodeGenie是什么? CodeGenie (代码精灵)作为鸿蒙DevEco IDE自带的AI辅助编码工具。
153 0
|
3月前
|
监控 JavaScript 开发工具
【HarmonyOS 5】鸿蒙中@State的原理详解
@State 是 HarmonyOS ArkTS 框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动 UI 的响应式编程模式。通过将变量标记为 @State,开发者可以确保当状态值发生变化时,依赖该状态的 UI 组件会自动重新渲染,从而保持数据与界面的实时同步。 @State 是 HarmonyOS ArkTS 实现响应式编程的大基础核心,可以说整个V1和V2都是围绕它来进行组合使用。
143 0
|
3月前
|
定位技术 开发工具 开发者
【HarmonyOS 5】桌面快捷方式功能实现详解
在移动应用开发中,如何让用户快速触达核心功能,是目前很常见的功能之一。 鸿蒙系统提供的**桌面快捷方式(Shortcuts)**功能,允许开发者为应用内常用功能创建直达入口,用户通过长按应用图标即可快速启动特定功能,大幅减少操作层级。 本文将结合地图导航场景,详细解析鸿蒙快捷方式的实现原理与开发流程。结合华为官方开源示例 DesktopShortcut 展开,该示例基于HarmonyOS 5.0实现,完整演示了地图导航场景的快捷方式开发流程。
195 0
|
3月前
|
消息中间件 物联网 开发工具
【HarmonyOS 5】鸿蒙中如何使用MQTT
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级、基于发布 / 订阅(Publish/Subscribe)模式的即时通讯协议,专为资源受限的物联网(IoT)设备和低带宽、高延迟或不可靠网络环境设计。
197 0