转自:http://www.cnblogs.com/Legends/p/4516551.html?utm_source=tuicool

前段时间,接到一个需求说要搞个摇一摇优惠券,效果如下:

                    图一                                                图二                                                图三                                                     图四                                                 图五

                                         

图一中

复制代码
 1 <script type="text/javascript">
 2 //“摇一摇”的动作既“一定时间内设备了一定距离”,因此通过监听上一步获
 3 //取到的x, y, z 值在一定时间范围内的变化率,即可进行设备是否有进行晃
 4 //动的判断。而为了防止正常移动的误判,需要给该变化率设置一个合适的
 5 //临界值。
 6     var SHAKE_THRESHOLD = 1800;
 7     var last_update = 0;
 8     var x = y = z = last_x = last_y = last_z = 0;
 9     var isPlayer = false;
10 
11 //在HTML5中,DeviceOrientation特性所提供的DeviceMotion事件封装
12 //了设备的运动传感器时间,通过改时间可以获取设备的运动状态、加速度
13 //等数据(另还有deviceOrientation事件提供了设备角度、朝向等息)。
14 //把监听事件绑定给 deviceMotionHandler
15     if (window.DeviceMotionEvent) {
16         window.addEventListener('devicemotion', deviceMotionHandler, false);
17     } else {
18         alert('本设备不支持devicemotion事件');
19     }
20 
21 //获取设备加速度信息 accelerationIncludingGravity
22     function deviceMotionHandler(eventData) {
23 
24         var acceleration = eventData.accelerationIncludingGravity;
25         var curTime = new Date().getTime();
26 //100毫秒进行一次位置判断,若前后x, y, z间的差值的绝对值和时间比率
27 //超过了预设的阈值,则判断设备进行了摇晃操作。
28         if ((curTime - last_update) > 100) {
29 
30             var diffTime = curTime - last_update;
31             last_update = curTime;
32             x = acceleration.x;
33             y = acceleration.y;
34             z = acceleration.z;
35             var speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 15000;
36             var status = document.getElementById("status");
37 
38             if (speed > SHAKE_THRESHOLD && !isPlayer) {
39 
40                 doResult();//摇玩之后,对摇出的结果作处理
41 
42             }
43             last_x = x;
44             last_y = y;
45             last_z = z;
46         }
47 
48     }
49     var isactive = false; //参与
50     function doResult() {
51         if (isactive) return;
52         isactive = true;
53         isPlayer = true;
54         //设置摇一摇的声音
55         var media = document.getElementById("musicBox");
56         media.setAttribute("src", '@Url.Content("~/Content/RedPacket/audio/shake.wav")');
57         media.load();
58         //设置摇玩结束的声音
59         var audioEle = document.getElementById("endMp3");
60         audioEle.setAttribute("src", '@Url.Content("~/Content/RedPacket/audio/end.mp3")');
61         audioEle.load();
62         
63         //跳到控制器中作判断
64         $.post('ShakeCouponsSubmit', {
65             openid: '@ViewBag.openid',
66             aid: '@ViewBag.aid',//摇一摇活动的id
67             wid: '@ViewBag.wid'//该公众账号的id
68         }, function (res) {
69          //TODO:中奖结果通知
70          //json返回 
71         }, "json");
72 
73         media.play();
74         setTimeout(function () {
75             media.pause();
76             audioEle.play();
77         }, 2000);
78 
79         document.getElementById("result").className = "result";
80         document.getElementById("hand").className = "hand hand-stop";
81 
82         setTimeout(function () {
83             document.getElementById("mask").className = "mask mask-open";
84             document.getElementById("result").className = "result result-show";
85         }, 2000);
86 
87     }
88 
89     $(function () {
90         //点击马上喊朋友也来摇,出现效果图五
91         $('#shareBtn').click(function () {
92             //TODO:分享跳转
93         });
94         //点击再来一次
95         $('#againBtn').click(function () {
96             window.location.reload();
97         });
98     });
99 </script>
复制代码

控制器中执行ShakeCouponsSubmit方法

复制代码
 1 [HttpPost]
 2         public JsonResult 摇一摇处理方法()
 3         {
 4         /////方法变量/////
 5             //摇一摇活动id
 6             //微信openid
 7             //中奖结果信息
 8         /////方法变量/////
 9 
10             /// 处理是否中奖
11             /// hidStatus 状态为-1:不能抽奖,直接跳转到结束页面;
12             /// 0:抽奖次数超过设置的最高次数;
13             /// 1:还可以继续抽奖;
14             /// 2:中奖了;
15 
16             if (判断今天是否超过了)
17             {
18                 return Json(new { status = "0", errInfo = "每人只有" + dayMaxTimes.ToString() + "次机会!", over = "0", remaintimes = remainTimes });
19             }
20         if(中奖了){
21                 //TODO:往中奖用户的卡包插数据
22                 List<Senparc.Weixin.MP.Entities.Article> _article_list = new List<Senparc.Weixin.MP.Entities.Article>();
23                _article_list.Add(new Senparc.Weixin.MP.Entities.Article()
24                {
25                  Description = 描述,
26                  PicUrl = 图片链接,
27                  Url = 超链接,
28                  Title = 标题
29                });
30                //推送消息至微信端
31                new WeChatUserDomain().SendNews(参数);
32             }
33         }
34 
35         /// <summary>
36         /// 返回中奖序列号
37         /// </summary>
38         /// <param name="id"></param>
39         /// <returns></returns>
40         public string Get_snumber(int 活动id)
41         {
42             Random rd = new Random((int)DateTime.Now.Ticks);
43             int radNum = rd.Next(0, 9);//从0到9里随机出一个值
44 
45             return "sn" + 活动id+ "_" + MyCommFun.ConvertDateTimeInt(DateTime.Now) + radNum;
46         }
复制代码

 由于某种原因,这里只是提供了一种思路,供参考。如需查看演示效果,可以关注公众号,进入微官网,点击营销活动,点击摇一摇进行试玩。



本文转载:CSDN博客