HTML5 实现手机摇一摇

HTML5新增了一些JavaScript API接口,比如地理定位、重力感应等。今天主要介绍devicemotion事件(设备事件),它提供设备的加速信息,表示为定义在设备上的坐标系。其还提供了设备在坐标系中的自转速率。若可行的话,事件应该提供设备重心处的加速信息。本文给大家讲解了HTML5实现手机摇一摇的效果。

手机摇一摇的实现思路:

1、检测设备是否支持重力传感;

// 监听运动传感事件,查看是否支持硬件运动
if (window.DeviceMotionEvent) {
    alert("您的设备支持硬件调用");
} else {
    alert("您的设备不支持硬件调用");
}

2、绑定运动传感(devimotion)事件;

window.addEventListener('devicemotion', deviceMotionHandler, false);

3、根据devimotion事件对象,获取三个方向的重力加速度;

/*
* [deviceMotionHandler 摇一摇处理函数]
* @param {[type]} eventData [事件对象]
* @return {[type]} [无返回值]
* @author 刘国利、陈能堡、HTML5学堂
*/
function deviceMotionHandler(eventData){
    // acceleration加速度
    var acceleration = eventData.accelerationIncludingGravity;
    $(".wrap")[0].innerHTML = acceleration.x + " " + acceleration.y + " " + acceleration.z;
}

4、为了防止系统认为简单的变化也是在摇动手机,所以在每隔一段时间进行三个方向值的计算;

// 获取当前时间
curTime = new Date().getTime();
if (curTime - lastTime > 100) {
    // 计算出时间断
    diffTime = curTime - lastTime;
    // 记录上一次的时间
    lastTime = curTime;
 
    // 获取当前的三个方向的值
    x = acceleration.x;
    y = acceleration.y;
    z = acceleration.z;
 
    // 计算速度,为了防止出现负数,进行绝对值
    speed = Math.abs((x + y + z - lastX - lastY - lastZ) / diffTime * 10000);
 
    // 记录上一次三个方向的值
    lastX = x;
    lastY = y;
    lastZ = z;
};

5、当计算的该值大于预定的值(阀值),执行相应的操作。

if (speed > SHAKE_THRESHOLD) {
    alert("实现了摇一摇");
};

图片来源于网络

完整的实例

var con = document.getElementById("con");
 
(function(){
    // 监听运动传感事件,查看是否支持硬件运动
    if (window.DeviceMotionEvent) {
        window.addEventListener('devicemotion', deviceMotionHandler, false);
    } else {
        alert("您的设备不支持硬件调用");
    }
 
    // 变量初始化
    var x = 0,
     y = 0,
     z = 0,
    lastX = 0,
    lastY = 0,
    lastZ = 0,
curTime = 0,
lastTime = 0,
diffTime = 0,
    speed = 0;
 
    // 设置一个阀值
    var SHAKE_THRESHOLD = 800; // 设定摇晃的阈值为600 运行相应操作
 
    /*
     * 功能:测算三个方向重力加速度,达到一定值进行相应操作
     * 作者:HTML5学堂、刘国利、陈能堡
     *
     */
    function deviceMotionHandler(eventData){
        var acceleration = eventData.accelerationIncludingGravity;
 
        // 获取当前时间
        curTime = new Date().getTime();
        // 计算时间差,当这个差值大于一定值执行计算三个方向的速度
        if ((curTime - lastTime) > 100) {
            // 记录上一次的时间
            diffTime = curTime - lastTime;
            lastTime = curTime;
 
            // 获取当前三个方向的值
            x = acceleration.x;
            y = acceleration.y;
            z = acceleration.z;
 
            // 计算速度,为了防止出现负数,进行绝对值
            speed = Math.abs((x + y + z - lastX - lastY - lastZ) / diffTime * 8000);
            if (speed > SHAKE_THRESHOLD) {
                alert("我实现摇一摇了");
            };
 
            // 记录上一次三个方向的值
            lastX = x;
            lastY = y;
            lastZ = z;                    
        };
    }
})();

原文发布于微信公众号 - HTML5学堂(h5course-com)

原文发表时间:2016-01-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏图形学与OpenGL

实验2 关系可视化

启动RStudio后,菜单栏点击Tools>Install Packages…中输入ggplot2,安装;

872
来自专栏FreeBuf

Python勒索软件来袭,国产杀软集体失身

* 本文原创作者:降草,本文属FreeBuf原创奖励计划,未经许可禁止转载 近日,fortinet截获一种使用python语言编写的勒索软件,并将其命名为 ...

1989
来自专栏用户2442861的专栏

Intellij IDEA 14.x 中的Facets和Artifacts的区别

from:http://blog.snsgou.com/post-306.html

593
来自专栏开源FPGA

基于FPGA的Uart接收图像数据至VGA显示

系统框图 ?   前面我们设计了基于FPGA的静态图片显示,并对一幅彩色图片提取了灰度,学习了RGB转Gray算法。这是基于一幅静态图片的,那么后面我们要怎么模...

2199
来自专栏张善友的专栏

在Expression Blend中使用XAML建立3D应用程序

参考微软<Creating 3D Content with WPF>文档翻译。 源文件下载http://www.wangpangzi.net/uploads/2...

1839
来自专栏十月梦想

node操作gm进行图像基本操作

上一篇介绍了GraphicsMagick的简单使用,这一批使用node结合gm处理一些图像的简单操作!

552
来自专栏偏前端工程师的驿站

让BASH,VIM美美的Powerline

前言  鉴于BASH及其周边强大的工具以及VIM高效快捷,加上现在我工作重心转移到前端开发上,因此我华丽地转向Linux阵营(当然从最傻瓜式的Ubuntu开始啦...

1966
来自专栏小樱的经验随笔

CTF---Web入门第七题 猫抓老鼠

猫抓老鼠分值:10 来源: 实验吧 难度:难 参与人数:8697人 Get Flag:3740人 答题人数:3944人 解题通过率:95% catch!catc...

3195
来自专栏张戈的专栏

让知更鸟主题的分类图标支持二级分类

今天,突然想启用知更鸟主题的分类图标功能,之前是怕影响速度,现在开了静态缓存,安心了一点。 参照鸟哥的方法在主题选项里面开启后,发现图片的超链接打不开!检查后发...

34312
来自专栏CDA数据分析师

有Bigger | 打造属于自己的 Python 编码环境

一个好的程序员必须善用各种工具提升自己的开发效率,和提升自己的幸福指数。另外,个人觉得vim还是值得自己重新一配的,我的配置过程基本都是在 读spf13的配置,...

1845

扫码关注云+社区