微信公众平台开发(108) 微信摇一摇

关键词:微信 摇一摇 DeviceOrientation DeviceMotion

本文介绍使用HTML5的DeviceOrientation特性在微信中实现摇一摇的功能。

在HTML5中,DeviceOrientation特性所提供的DeviceMotion事件封装了设备的运动传感器时间,通过改时间可以获取设备的运动状态、加速度等数据(另还有deviceOrientation事件提供了设备角度、朝向等信息)。
而通过DeviceMotion对设备运动状态的判断,则可以帮助我们在网页上就实现“摇一摇”的交互效果。

运动事件监听

    if (window.DeviceMotionEvent) {
        window.addEventListener(‘devicemotion‘, deviceMotionHandler, false);
    } else {
        alert(‘你的手机太差了,扔掉买个新的吧。__方倍工作室‘);
    }

获取加速度信息

“摇一摇”的动作既“一定时间内设备了一定距离”,因此通过监听上一步获取到的x, y, z 值在一定时间范围内的变化率,即可进行设备是否有进行晃动的判断。而为了防止正常移动的误判,需要给该变化率设置一个合适的临界值。
运行代码编辑代码查看源代码资源添加向导

    function deviceMotionHandler(eventData) {
        var acceleration = eventData.accelerationIncludingGravity;
        var curTime = new Date().getTime();

        if ((curTime - last_update) > 100) {
            var diffTime = curTime - last_update;
            last_update = curTime;
            x = acceleration.x;
            y = acceleration.y;
            z = acceleration.z;
            var speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000;
            var status = document.getElementById("status");

            if (speed > SHAKE_THRESHOLD) {
                doResult();
            }
            last_x = x;
            last_y = y;
            last_z = z;
        }
    }

模拟微信摇一摇效果

  1 <!doctype html>
  2 <html>
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>微信摇一摇红包</title>
  6     <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
  7     <style>
  8     * { margin: 0; padding: 0; }
  9     body { background: #292D2E; }
 10     .hand { width: 190px; height: 300px; background: url(hand.png) no-repeat; position: absolute; top: 50px; left: 50%; margin-left: -95px; }
 11     .hand-animate { -webkit-animation: hand_move infinite 2s; }
 12     .result { background: #393B3C; border: #2C2C2C 1px solid; box-shadow: inset #4D4F50 0 0 0 1px; border-radius: 10px; color: #fff; padding: 10px; width: 300px; position: absolute; top: 300px; left: 50%; margin-left: -161px; opacity: 0;
 13         -webkit-transition: all 1s;
 14            -moz-transition: all 1s;
 15             -ms-transition: all 1s;
 16              -o-transition: all 1s;
 17                 transition: all 1s; }
 18     .result .pic { width: 50px; height: 50px; float: left; background: #fff; }
 19     .result .con { overflow: hidden; zoom: 1; padding-left: 10px; line-height: 24px; }
 20     .result-show { opacity: 1; margin-top: 50px; }
 21     .loading { position: absolute; top: 240px; left: 50%; margin-left: -50px; width: 100px; height: 100px; background: url(spinner.png) no-repeat; background-size: 100px 100px; opacity: 0;
 22         -webkit-animation: loading infinite linear .5s;
 23            -moz-animation: loading infinite linear .5s;
 24             -ms-animation: loading infinite linear .5s;
 25              -o-animation: loading infinite linear .5s;
 26                 animation: loading infinite linear .5s;
 27         -webkit-transition: all .5s;
 28            -moz-transition: all .5s;
 29             -ms-transition: all .5s;
 30              -o-transition: all .5s;
 31                 transition: all .5s; }
 32     .loading-show { opacity: 1; }
 33
 34     @-webkit-keyframes hand_move {
 35         0% {
 36             -webkit-transform: rotate(0);
 37                -moz-transform: rotate(0);
 38                 -ms-transform: rotate(0);
 39                  -o-transform: rotate(0);
 40                     transform: rotate(0); }
 41         50% {
 42             -webkit-transform: rotate(15deg);
 43                -moz-transform: rotate(15deg);
 44                 -ms-transform: rotate(15deg);
 45                  -o-transform: rotate(15deg);
 46                     transform: rotate(15deg); }
 47         100% {
 48             -webkit-transform: rotate(0);
 49                -moz-transform: rotate(0);
 50                 -ms-transform: rotate(0);
 51                  -o-transform: rotate(0);
 52                     transform: rotate(0); }
 53     }
 54     @-webkit-keyframes loading {
 55         0% {
 56             -webkit-transform: rotate(0);
 57                -moz-transform: rotate(0);
 58                 -ms-transform: rotate(0);
 59                  -o-transform: rotate(0);
 60                     transform: rotate(0); }
 61         100% {
 62             -webkit-transform: rotate(360deg);
 63                -moz-transform: rotate(360deg);
 64                 -ms-transform: rotate(360deg);
 65                  -o-transform: rotate(360deg);
 66                     transform: rotate(360deg); }
 67     }
 68     </style>
 69 </head>
 70 <body>
 71
 72     <div id="hand" class="hand hand-animate"></div>
 73     <div id="loading" class="loading"></div>
 74     <div id="result" class="result">
 75         <div class="con">你摇到了一个18元的红包</div>
 76     </div>
 77     <script>
 78     var SHAKE_THRESHOLD = 800;
 79     var last_update = 0;
 80     var x = y = z = last_x = last_y = last_z = 0;
 81
 82     if (window.DeviceMotionEvent) {
 83         window.addEventListener(‘devicemotion‘, deviceMotionHandler, false);
 84     } else {
 85         alert(‘你的手机太差了,扔掉买个新的吧。__方倍工作室‘);
 86     }
 87
 88     function deviceMotionHandler(eventData) {
 89         var acceleration = eventData.accelerationIncludingGravity;
 90         var curTime = new Date().getTime();
 91
 92         if ((curTime - last_update) > 100) {
 93             var diffTime = curTime - last_update;
 94             last_update = curTime;
 95             x = acceleration.x;
 96             y = acceleration.y;
 97             z = acceleration.z;
 98             var speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000;
 99             var status = document.getElementById("status");
100
101             if (speed > SHAKE_THRESHOLD) {
102                 doResult();
103             }
104             last_x = x;
105             last_y = y;
106             last_z = z;
107         }
108     }
109
110     function doResult() {
111         document.getElementById("result").className = "result";
112         document.getElementById("loading").className = "loading loading-show";
113         setTimeout(function(){
114             //document.getElementById("hand").className = "hand";
115             document.getElementById("result").className = "result result-show";
116             document.getElementById("loading").className = "loading";
117         }, 1000);
118     }
119     </script>
120 </body>
121 </html>

效果图

时间: 2024-11-11 17:32:03

微信公众平台开发(108) 微信摇一摇的相关文章

微信公众平台开发(102) 微信支付账号体系

本文介绍微信支付账号体系各参数. 商户在微信公众平台提交申请资料以及银行账户资料,资料审核通过并签约后,可以获得表6-4所示帐户(包含财付通的相关支付资金账户),用于公众帐号支付. 帐号 作用 appId 公众帐号身份的唯一标识.审核通过后,在微信发送的邮件中查看. appSecret 公众帐号支付请求中用于加密的密钥Key,可验证商户唯一身份,PaySignKey对应于支付场景中的appKey值.审核通过后,在微信发送的邮件中查看. paySignKey 除了支付请求需要用到paySignKe

微信公众平台开发(101) 微信支付URL配置

本文介绍微信支付申请时如何设置授权目录及URL. 一.选择支付类型 目前有两种支付类型 JS API网页支付 Native原生支付 如果没有特殊要求,两种都勾选. 二.支付授权目录 目前可以选择http还是https协议,没有特别要求,选择http.对安全要求比较高的企业,请选择https. 支付授权目录填写自己公司的域名加上目录,目录可以是不存在的目录,例如wxpay. 一个完整的目录参考如下: http://www.doucube.com/wxpay/ 蓝色部分表示要选择的. 红色部分表示要

【微信公众平台开发】微信刮刮乐,解决三星兼容性问题

刮刮乐jquery插件:wScratchPad 完整项目资源下载:点击打开链接 运用wScratchPad插件很快弄出刮刮乐的效果,代码如下: <!DOCTYPE html> <html> <head> <meta CHARSET="UTF-8"> <title>刮刮乐</title> <script type="text/javascript" src="./inc/jquer

【微信公众平台开发】微信幸运大转盘

需要js插件(下载包地址:http://download.csdn.net/detail/wyz365889/7798255): jquery jQueryRotate.2.2.js jquery.easing.min.js 前端显示代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name=

微信公众平台开发(110) 微信连Wi-Fi

关键字:微信公众平台 微信连Wi-Fi 微信 WiFi 硬件鉴权作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/weixin-wifi.html 微信连Wi-Fi是为商家的线下场所提供一套完整和便捷的微信连Wi-Fi的方案.商家接入微信连Wi-Fi后,顾客无需输入繁琐的Wi-Fi密码,通过微信扫二维码等方式即可快速上网.微信连Wi-Fi还帮助商家打造个性化服务,如提供微信顶部常驻入口.商家主页展示.连网后公众号下发消息等.因此,微信连Wi-Fi既可以极大

微信公众平台开发(121) 微信二维码海报

关键字:微信公众平台 二维码 海报作者:方倍工作室原文: http://www.cnblogs.com/txw1958/p/weixin-poster.html 本文介绍微信公众平台下二维码海报的开发过程. 一.微信二维码海报介绍 微信二维码海报是指在海报中嵌入和微信用户关联的参数二维码的海报,用户分享推广之后,新用户可以被统计为被推广人员数,从而达到增加粉丝的传播效果.其使用场景如下:   二.开发流程 在微信二维码海报生成中,需要用到以下信息 1. 自定义菜单中设置一个菜单项,点击后返回二维

微信公众平台开发-- 关闭微信浏览器

在这篇微信公众平台开发教程中,我们将介绍如何使用微信JS接口关闭微信内置浏览器返回到微信聊天窗口界面. 微信的JS接口目前已公布了三种:右上角按钮/底部导航栏/用户网络状态,另外转发到朋友圈和分享到好友也可以使用JS接口来定义. 而关闭微信浏览器可以使用 WeixinJSBridge.call('closeWindow');" 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 2 &l

微信公众平台开发之微信access_token如何有效长期保存

随着微信使用越来越广泛,微信公众平台开放了许多接口以提供更多个性化的服务,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发者在调用这些接口时,都需要传入一个相同的参数access_token,它是公众账号的全局唯一票据,它是接口访问凭证. access_token的有效期是7200秒(两小时),在有效期内可以使用,一旦access_token过期,需要重新通过调用微信接口获取.目前微信接口上面获取access_token每日限额为2000次,如果每次创建菜单,发送主

微信公众平台开发[2] —— 微信端分享功能

初次尝试微信公众号的开发,对于学习方法的探索都是来源于网上的博客.问答,对于参差不齐的信息,自己也是有苦说不出,抽出一点时间写点文章,既是对自己的学习总结,也希望给予同是菜鸟的学渣一点帮助.-- 前言. 背景介绍: 今天想添加微信分享的功能,如果不进行自定义设计,那么当我们点击分享朋友圈.好友或者QQ好友.空间时,默认的标题就是<title>标签中的信息,而显示的描述信息就是链接,图片多是默认为页面中显示的第一张图片,显然这样的处理是不合理的,所以需要查询开发文档进行编码设计. 操作步骤: 一