因为工作需要,这段时间接触的手机传感器比较多。
总体来说,市场上的传感器表现参差不齐。IPhone在传感器表现方面卓越,而安卓由于什么机型都有,则显得差强人意。


首先还是说说怎么在web端调用手机传感器吧。
这个还是比较简单的,只需要添加一个事件就可以了。
在最新的h5规范里面,引入了 DeviceOrientation 事件。如果没猜错,该接口应该是调用手机里的综合方向传感器。
事实上,手机上的方向传感器有多个。例如在安卓手机上就有11种传感器,而诸如

  • TYPE_GYROSCOPE
  • TYPE_LINEAR_ACCELERATION
  • TYPE_MAGNETIC_FIELD
  • TYPE_ORIENTATION
  • TYPE_ROTATION_VECTOR

均可以用作对手机的状态翻转等进行监测。当然这需要不同的方法,按下不表。
而目测DeviceOrientation方法是结合了重力检测与磁场检测两方面实现的翻转检测。
DeviceOrientation方法主要监测的是手机上的三个翻转角。
你可以将手机水平至于桌面上。

  • 手机在水平面上旋转为alpha角,此角是基于Z轴旋转。实现方式一般是基于磁场。因此在各种机型上你可以发现这个数值差异十分大。
  • 手机正常翻起与桌面夹角为beta角,此角是基于X轴旋转。实现方式一般是基于重力分量。
  • 手机侧翻与桌面夹角为gama角,此角是基于Y轴旋转。实现方式也是基于重力分量。

我们可以在w3c上阅读相关的定义数据。

做一个做简单的调用例子

if (window.DeviceOrientationEvent) {
大专栏  web端手机方向传感器闲谈window.addEventListener('deviceorientation', function(event) {
var a = event.alpha,
b = event.beta,
g = event.gamma;
console.log('Orientation - Alpha: ' + a + ', Beta: '+ b + ', Gamma: ' + g);
}, false);
} else {
console.log('This device does not support deviceorientation');
}

借用这段代码你就可以看到手机上的方向传感器封装后的API显示出来的数值。
但是当你记录下来后,你可以发现。该数值在IPhone上是连续而且稳定的。但是在安卓上却十分容易产生波动。
那么,如何去除这种波动则成为了一个十分重要的问题了。


事实上,这个问题也很简单。
我们只需要人工制造一个滤波器就可以了。
假设我们接受的数值为X,则设上一次数值为Xp,我们可以运用一个加权函数降低波动带来的影响。

final=Xalpha+(1-alpha)Xp

当然,假如你的要求比较精细。很多时候简单的一次加权并不能完整去除波动。
所以我们可以采用记录多个以往的值进行平均。

final = (X+(Xp1+Xp2+Xp3+Xp4))/5

通过这种方式得出的数值波动会降低并且更加流畅。
鉴于此,对于传感器的数据调用,一定要真机调试取值适配机型,不要想当然的设置。例如当你把手机与地面垂直的时候,由于磁场感应器位置不佳,容易出现各种方向数值紊乱的场景。因此不推荐调用各种极值的数值。


而关于手机传感器调用的频率,大概是50ms一次。因此我们不需要太过担心带来影响。

web端手机方向传感器闲谈的更多相关文章

  1. 《物联网框架ServerSuperIO教程》-22.Web端对传感器实时监测与控制。附:v3.6.8版本,支持WebSocket

    1.ServerSuperIO v3.6.8更新内容 1.1 增加WebSocket服务端功能,支持自控模式.并发模式.单例模式,不支持轮询模式1.2 接收数据缓存与现有的IO实例分离.1.3 优化代 ...

  2. 新发现:AirDroid(用Web端控制自己的手机发信息)

    http://web.airdroid.com/ 好多功能呀,有空研究研究 http://jingyan.baidu.com/article/b24f6c82cd4ade86bfe5daf3.html ...

  3. Android利用方向传感器获得手机的相对角度实例说明

    http://www.jb51.net/article/37710.htm 1.android 的坐标系是如何定义x, y z 轴的 x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较 ...

  4. 利用websocket实现手机扫码登陆后,同步登陆信息到web端页面

    新手必看 广播系统 事件系统 准备工作 初始化项目 引入 laravel-websockets 软件包 启动 websocket 监听 主要流程 创建两个页面 建立 socket 连接 手机端扫码登陆 ...

  5. iOS拍照上传后,在web端显示旋转 Swift+OC版解决方案

    问题描述: 手机头像上传,遇到一个怪现象,就是拍照上传时,手机端显示头像正常,但在web端查看会有一个左旋90度的问题. 并且照片竖怕才会有此问题,横拍不存在. 原因分析: 手机拍照时,用相机拍摄出来 ...

  6. 通过手机Web实现手机摇一摇的功能

    经常我们玩微信都会用到查到附近的人,都是在app上实现手机摇一摇的功能.现在,我们将此技术搬移到手机web上,供大家学习,主要是用到HTML5的重要特性就是DeviceOrientation:官方文档 ...

  7. web端 第一天认识基础

    .NET 分为两大类 一.客户端应用程序   C/S 技术: Winform WPF MFC   MVVM 二.外部端应用程序  B/S(网页端应用程序/WEB端/WEB端应用程序) 目前学的技术是A ...

  8. web端,app端,小程序端测试差异详解

    前置解释:1.单纯从功能测试的层面上来讲的话,APP 测试.web 测试和H5测试在流程和功能测试上是没有区别的2.Web项目或pc项目都是在电脑上进行测试的.常见的PC项目架构有BS架构和CS架构的 ...

  9. 简单的方向传感器SimpleOrientationSensor

    SimpleOrientationSensor是一个简单的方向传感器.能够识别手机如下表的6种方向信息: SimpleOrientation枚举变量 方向 NotRotated 设备未旋转 Rotat ...

随机推荐

  1. 1017A.The Rank#排名

    题目出处:http://codeforces.com/problemset/problem/1017/A #include<iostream> using namespace std; i ...

  2. BBS项目架构实现

    一.注册功能 注册页面搭建 auto_id 数据校验 使用forms组件实现(forms) 创建一个文件夹随意,创建一个.py中 在.py文件中创建类继承form.Form 创建字段实现,实现对字段的 ...

  3. 93.QuerySet转换为SQL的条件:迭代,切片(指定步长),len函数,list函数,判断

    生成一个QuerySet对象并不会马上转换为SQL语句去执行. books = Book.objects.filter(pk=3) print(connection.queries) 打印出djang ...

  4. mysql Communications link failure Last packet sent to the server was X ms ago

    想必大家在用MySQL时都会遇到连接超时的问题,如下图所示: 就是这个异常(com.mysql.jdbc.exceptions.jdbc4.Communication***ception:Commun ...

  5. mysql 几个坑

    浮点转int类型 更新合并换成插入 不要频繁更新超过20个字节的字段 程序逻辑得到数据处理后才还回连接

  6. codeforce 1188A1 Add on a Tree 树

    题意:给你一个树,有一种操作,选择两个叶子节点,然后把这两个叶子节点间的路径全部加或减一个值.问你给出的树上的每一条边经过若干次操作是否可以为任意值. 分析:画几个图后可以发现,如果树中存在一个点的度 ...

  7. vue打包成app后,点击手机上的物理返回按钮后直接退出app

    在浏览器上浏览vue项目时,后退按钮是可以正常返回上一页的,但是打包成app后,点击手机上的屋里返回按钮,就直接退出app回到桌面了, 以下是解决办法: 使用mui进行手机的物理键的监听 1.首先安装 ...

  8. 17)C++开始--命名空间

    命名空间:就是区分同一个名字,在不同的作用域的变量 代码展示 #include<iostream> namespace spaceA{ ; namespace spaceB{ struct ...

  9. 2)thinkphp的带有命名空间的自动加载机制

    (1)为啥thinkphp里面的文件要是写你的命名空间,要与你的路径一样,因为在thinkphp实现自动加载机制的原理,就是靠的你的命名空间对应这个路径,然后自动加载机制通过这个路径找到你的类文件,然 ...

  10. C/C++预处理指令#include,#define,#undef,#if,#ifdef,#ifndef,#elif,#endif,#error......

    本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下 ...