实现摇一摇功能- H5 设备运动事件DeviceMotionEvent DeviceOrientationEvent

简介: 新年不是搞了个摇签的功能吗,弹幕效果咱们前面讲过了,今天来说说摇一摇效果

DEMO


  1. 基础 DEMO,摇一摇然后可以看红绿色,有颜色代表触发。


  1. 完整 DEMO


  • 摇一摇手机,绿色变为黄色,为分数统计
  • 黄色 + 触发 50 阈值时 ,触发 200ms 震动
  • 黄色 + 触发 100 阈值时 ,触发声音效果


设备方向和运动监听


html 5 提供了一些方法在移动端获得设备方向及运动(因为他是依赖传感器硬件的,pc 没有也不存在抱着台式机跑来跑去场景)。传感器包括陀螺仪、加速器和磁力仪(罗盘)。

可以实现什么效果?


  1. VR


  1. 刺激战场的陀螺仪微调


  1. 我们这里用到的摇一摇


devicemotion


DeviceMotionEvent 在设备发生摆动、运动(手机疯狂摇摆,摇一摇场景)时产生。


devicemotion 是用来监听手机加速度变化的事件回调中可以提供设备的加速度信息。

表示为在设备上定义的坐标系中的笛卡尔坐标,提供了设备在坐标系中的自转速率。


对于一个竖屏摆放的设备来说,设备三个方向轴的位置为:


  1. X 方向为从设备的左边(负 -)到右边(正 +)


  1. Y 方向为从设备的底部(负 -)到顶部(正 +)


  1. Z 方向为垂直于屏幕由设备的背面(负 -)到正面(正 +)。


有 4 个只读属性:属性测试Demo摇晃小球Demo(加速度)


  1. accelerationIncludingGravity:设备在 X,Y,Z 轴方向上带重力的加速度的对象。加速度的单位为 m/s²。重力加速度(包括重心引力)


  1. acceleration:设备在 X, Y, Z 轴方向上加速度的对象。加速度的单位为 m/s²。加速度(需要设备陀螺仪支持)


  1. rotationRate:设备在 alpha,beta, gamma 轴方向上旋转的速率的对象。旋转速率的单位为 °/s(degrees per seconds) 。旋转速度


  1. interval:表示从设备获取数据的频率,单位是毫秒。获取的时间间隔


deviceorientation


DeviceOrientationEvent 加速度传感器检测到设备在方向上产生变化时触发。


监听设备方向(设备旋转和仰角变化的行为),提供设备的物理方向信息,表示为一系列本地坐标系的旋角。


属性有三个,用于描述设备方向:属性测试摇晃小球Demo(当前设备方向)


  1. alpha
  2. beta
  3. gamma


当手机禁止的时候你会发现他是不动的。拿起移动时就会发现回调开始调用。


摇一摇功能实现


  1. devicemotion-demo 我们可以使用 devicemotion 直接来监听设备的运动,当他超过特定的阈值,我们就认为在摇一摇。


接下来,我们可以摇起来了,可以看到背景色会从绿色变为黄色,然后也有触发阈值的次数的统计。


bVbGTxU.webp.jpg


window.addEventListener('devicemotion', (e) => {
     console.log(e)
     if(this.devicemotionReturn) return ;
     this.historyDevicemotion = JSON.parse(JSON.stringify(this.devicemotion))
     this.devicemotion.accelerationIncludingGravity.x = e.accelerationIncludingGravity.x
     this.devicemotion.accelerationIncludingGravity.y = e.accelerationIncludingGravity.y
     this.devicemotion.accelerationIncludingGravity.z = e.accelerationIncludingGravity.z
     if(this.historyDevicemotion.accelerationIncludingGravity.x || 
         this.historyDevicemotion.accelerationIncludingGravity.y || 
         this.historyDevicemotion.accelerationIncludingGravity.z){
         // 计算单一方向加速度的差值
         var thresholdCount = Math.max(
             Math.abs(this.historyDevicemotion.accelerationIncludingGravity.x - e.accelerationIncludingGravity.x),
             Math.abs(this.historyDevicemotion.accelerationIncludingGravity.y - e.accelerationIncludingGravity.y),
             Math.abs(this.historyDevicemotion.accelerationIncludingGravity.z - e.accelerationIncludingGravity.z)   
         )
         // 阈值判断
         if(thresholdCount > 1) this.devicemotion.thresholdCount_1++;
         if(thresholdCount > 5) this.devicemotion.thresholdCount_5++;
         if(thresholdCount > 10) this.devicemotion.thresholdCount_10++;
         if(thresholdCount > 15) this.devicemotion.thresholdCount_15++;
         if(thresholdCount > 20) this.devicemotion.thresholdCount_20++;
         if(thresholdCount > 25) this.devicemotion.thresholdCount_25++;
         if(thresholdCount > 50) this.devicemotion.thresholdCount_50++;
         if(thresholdCount > 100) this.devicemotion.thresholdCount_100++;
         // 颜色变化逻辑
         if(thresholdCount > 20) this.devicemotion.shakeValue = Math.min(255, this.devicemotion.shakeValue + 10)
     }
 })


2.deviceorientation-demo 我们可以使用 deviceorientation 来监听设备的方向变化,也是设置阈值,超过一定的幅度我们就认为在摇动手机。测试方法同上我就不多介绍了。


震动功能实现


测试地址Navigator.vibrate() 可以使设备(需硬件支持,手机一般都有响铃并震动功能)产生有频率(可以传入数组)的震动。


若设备不支持震动,该方法将无效。


若某震动方式已经在进行中(当该方法调用时),则前一个震动方式停止,新的取而代之。


若因为提供无效的参数使得无法使设备震动,它将返回false,否则返回true。


若振动方案导致长时间的震动,它会被截断:最大震动时长取决于每个浏览器的具体实现。


navigator.vibrate(duration);


  1. window.navigator.vibrate(200); 一个200ms的震动


  1. window.navigator.vibrate(0); 停止震动,可以理解为覆盖,然后震动0ms


  1. window.navigator.vibrate([100,30,100,30,100,200,200,30,200,30,200,200,100,30,100,30,100]); 有频率的震动,奇数位为震动时间,偶数位为暂停时间。我下标按1开始的啊。


声音播放功能实现


声音播放我们就直接使用 audio 标签实现即可,测试地址。复杂一点可以看我之前写的基于better-scroll 实现歌词联动功能

相关文章
|
移动开发 JavaScript 前端开发
分享46个JS抽奖转盘,总有一款适合您
分享46个JS抽奖转盘,总有一款适合您
371 1
|
安全 算法 Java
5 款阿里常用代码检测工具,免费用!
5 款阿里常用代码检测工具免费体验,仅需 2 步,Cherry键盘、公仔抱回家,100%拿奖!
5 款阿里常用代码检测工具,免费用!
FEC1 Waiting for PHY auto negotiation to complete......... TIMEOUT !
FEC1 Waiting for PHY auto negotiation to complete......... TIMEOUT !
616 0
|
9月前
|
SQL 数据可视化 Java
JimuReport 积木报表 v1.9.5 发布,免费的可视化报表
JimuReport是一款免费的数据可视化报表工具,支持复杂报表、打印设计、图表报表、门户设计和大屏展示等功能。其Web版设计器操作简单,类似Excel风格,通过拖拽即可完成设计,支持SQL与API数据源绑定,具备表达式计算和合计功能。此外,还支持ECharts 28种图表、分组交叉报表、打印设计以及炫酷大屏制作,满足各类企业需求。重要的是,它永久免费,傻瓜式操作,是DataV和帆软的优秀开源替代方案。
379 0
|
机器学习/深度学习 存储 算法
机器学习面试笔试知识点-决策树、随机森林、梯度提升决策树(GBDT)、XGBoost、LightGBM、CatBoost
机器学习面试笔试知识点-决策树、随机森林、梯度提升决策树(GBDT)、XGBoost、LightGBM、CatBoost
1325 0
|
运维 前端开发 数据处理
浅谈领域驱动在前端的应⽤
领域驱动是⼀种思想,不仅可以应⽤于软件开发,也没有绝对的开发规范,适合⾃⼰的业务和团队背景就好,我们不是为了应⽤⽽应⽤,⽽是为了解决问题。
|
10月前
|
测试技术 开发者 Docker
llama2 70B mindie推理开箱报错问题
遇到问题,先从基本的检查开始,先检查卡有没有被占用,有的话就kill掉(如果是别人的任务,先知会一下哈)!其次,不要自己随意组合版本,否则会因为经验不足卡在莫名其妙的问题上。
160 3
|
数据采集 监控 架构师
主数据管理实施方案:规划与具体策略的全面解析
在当今数字化转型的浪潮中,主数据管理(MDM, Master Data Management)已成为企业提升数据质量、优化业务流程、增强决策能力的重要基石。一个成功的主数据管理实施方案不仅需要周密的规划,还需要具体可行的策略来确保项目顺利推进并达到预期效果。
1248 4
|
传感器 运维 网络协议
Modbus故障码速查手册(故障码含义、分析原因、详细解读)
当涉及到Modbus通信协议的故障排查和调试时,速查手册是一项极为重要的资源。了解故障码及其含义能够帮助工程师在通信问题出现时迅速定位和解决相关故障。 本篇文章旨在为读者提供一个方便快速查阅的资源,以便快速获取有关Modbus通信中可能出现的故障码的信息。通过仔细研究这些故障码,读者可以更有效地诊断和解决通信问题,减少故障排查的时间。
5132 0
|
传感器 物联网 Android开发
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
552 1