微信小程序开发摇一摇功能


Posted in Javascript onNovember 22, 2019

微信小程序摇一摇

方法定义: 

let shakeInfo = {
 openFlag: false,// 是否开启摇一摇,*****注意:如果是小程序全局监听摇一摇,这里默认为true
 shakeSpeed: 110,//设置阈值,越小越灵敏
 shakeStep: 2000,//摇一摇成功后间隔
 lastTime: 0,//此变量用来记录上次摇动的时间
 x: 0,
 y: 0,
 z: 0,
 lastX: 0,
 lastY: 0,
 lastZ: 0, //此组变量分别记录对应 x、y、z 三轴的数值和上次的数值
};
function openShakeEvent() {
 shakeInfo.openFlag = true;
}
function closeShakeEvent() {
 shakeInfo.openFlag = false;
}
function shakeOk() {
 closeShakeEvent();
 setTimeout(function () {
  openShakeEvent();
 }, shakeInfo.shakeStep);
}
/**
 * 判断是否为摇一摇
 */
function shake(acceleration, successCallback) {
 if (!shakeInfo.openFlag) {
  return;
 }
 var nowTime = new Date().getTime(); //记录当前时间
 //如果这次摇的时间距离上次摇的时间有一定间隔 才执行
 if (nowTime - shakeInfo.lastTime > 100) {
  var diffTime = nowTime - shakeInfo.lastTime; //记录时间段
  shakeInfo.lastTime = nowTime; //记录本次摇动时间,为下次计算摇动时间做准备
  shakeInfo.x = acceleration.x; //获取 x 轴数值,x 轴为垂直于北轴,向东为正
  shakeInfo.y = acceleration.y; //获取 y 轴数值,y 轴向正北为正
  shakeInfo.z = acceleration.z; //获取 z 轴数值,z 轴垂直于地面,向上为正
  //计算 公式的意思是 单位时间内运动的路程,即为我们想要的速度
  var speed = Math.abs(shakeInfo.x + shakeInfo.y + shakeInfo.z - shakeInfo.lastX - shakeInfo.lastY - shakeInfo.lastZ) / diffTime * 10000;
  //console.log(speed)
  if (speed > shakeInfo.shakeSpeed) { //如果计算出来的速度超过了阈值,那么就算作用户成功摇一摇
   successCallback();
  }
  shakeInfo.lastX = shakeInfo.x; //赋值,为下一次计算做准备
  shakeInfo.lastY = shakeInfo.y; //赋值,为下一次计算做准备
  shakeInfo.lastZ = shakeInfo.z; //赋值,为下一次计算做准备
 }
}

方法调用,在小程序启动首页页面onLoad添加如下代码:

/**
  * 生命周期函数--监听页面加载
  */
 onLoad: function(options) {
  //
  wx.onAccelerometerChange(function(acceleration) {
   Main.shake(acceleration, function() {
    Main.shakeOk();
    Main.openBarCodeDlg(); // 在这里调用摇一摇成功后执行的代码
   });
  });
 }

如果是小程序全局都监听摇一摇,以上代码就可以实现,如果只是配置指定某几个页面监听,则需要在监听的页面做以下code:

onShow: function() {
 Main.openShakeEvent();
},
onHide: function() {
 Main.closeShakeEvent();
}

这样在跳转到非监听页面时就不会执行你的代码了

补充:下面看下微信小程序 实现摇一摇重力感应API

微信小程序并没有提供摇一摇API接口,但是提供了一个重力感应的API 「wx.onAccelerometerChange(CALLBACK)」,我们可以用这个方法来模拟微信摇一摇功能,代码如下:

Page({
  onShow: function () {
    wx.onAccelerometerChange(function (e) {
      console.log(e.x)
      console.log(e.y)
      console.log(e.z)
      if (e.x > 1 && e.y > 1) {
        wx.showToast({
          title: '摇一摇成功',
          icon: 'success',
          duration: 2000
        })
      }
    })
  },
  onHide: function(){
    
  }
})

但如果小程序需要启用tabbar的话,这样启用重力感应API会使tabbar下面所有页面都会监听到重力感应数据,导致模拟摇一摇在所有页面都能出现摇一摇的结果,这并不是我们想要的,我们只是想在tabbar下其中一个页面允许他获取到重力感应数据,那么就需要我们自己加入一个是否在当前页面的判断,根据判断结果来启用监听重力感应API,代码修改如下:

Page({
  isShow: false,
  onShow: function () {
    var that = this;
    this.isShow = true;
    wx.onAccelerometerChange(function (e) {
      if(!that.isShow){
        return
      }
      console.log(e.x)
      console.log(e.y)
      console.log(e.z)
      if (e.x > 1 && e.y > 1) {
        wx.showToast({
          title: '摇一摇成功',
          icon: 'success',
          duration: 2000
        })
      }
    })
  },
  onHide: function(){
    this.isShow = false;
  }
})

总结

以上所述是小编给大家介绍的微信小程序开发摇一摇功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jquery获取input的value问题说明
Aug 19 Javascript
javascript针对DOM的应用实例(一)
Apr 15 Javascript
七个很有意思的PHP函数
May 12 Javascript
浅谈 jQuery 事件源码定位问题
Jun 18 Javascript
浅谈javascript中字符串String与数组Array
Dec 31 Javascript
jQuery中:selected选择器用法实例
Jan 04 Javascript
jQuery实现tag便签去重效果的方法
Jan 20 Javascript
简单的分页代码js实现
May 17 Javascript
BootStrap实现树形目录组件代码详解
Jun 21 Javascript
封装获取dom元素的简单实例
Jul 08 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
Aug 02 Javascript
Vue清除定时器setInterval优化方案分享
Jul 21 Javascript
js实现录音上传功能
Nov 22 #Javascript
解决vue自定义全局消息框组件问题
Nov 22 #Javascript
JavaScript实现省市联动效果
Nov 22 #Javascript
Vue混入mixins滚动触底的方法
Nov 22 #Javascript
超简单的微信小程序轮播图
Nov 22 #Javascript
微信小程序实现Swiper轮播图效果
Nov 22 #Javascript
Js代码中的span拼接问题解决
Nov 22 #Javascript
You might like
我的群发邮件程序
2006/10/09 PHP
让你的网站首页自动选择语言转跳
2006/12/06 PHP
PHP 数据库树的遍历方法
2009/02/06 PHP
laravel5环境隐藏index.php后缀(apache)的方法
2019/10/12 PHP
php实现简易计算器
2020/08/28 PHP
JCalendar 日历控件 v1.0 beta[兼容IE&Firefox] 有文档和例子
2007/05/30 Javascript
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
对frameset、frame、iframe的js操作示例代码
2013/08/16 Javascript
js修改input的type属性问题探讨
2013/10/12 Javascript
JavaScript简单实现鼠标拖动选择功能
2014/03/06 Javascript
JavaScript中string对象
2015/06/12 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
几行js代码实现自适应
2017/02/24 Javascript
使用Angular CLI生成路由的方法
2018/03/24 Javascript
Angular模版驱动表单的使用总结
2018/05/05 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
2020/07/17 Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
2020/07/21 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
[09:43]DOTA2每周TOP10 精彩击杀集锦vol.5
2014/06/25 DOTA
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
通过实例解析python and和or使用方法
2020/11/14 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
说出数据连接池的工作机制是什么?
2013/04/19 面试题
linux比较文件内容的命令是什么
2013/03/04 面试题
求职信写作要突出重点
2014/01/01 职场文书
岗位职责风险防控
2014/02/18 职场文书
法律进学校实施方案
2014/03/15 职场文书
单位实习鉴定评语
2015/01/04 职场文书
辞职信格式模板
2015/02/27 职场文书
Windows server 2016服务器基本设置
2022/08/14 Servers