看了网上很多关于此类方法的介绍,最多的是使用加速传感器,根据三个分量(x,y,z)的差值相加来判断移动距离,可是我觉得不太靠谱,三个分量差值平方和开平方才是正确距离,至少从数学角度来着,这样比较精确,以下是代码(注释已经比较详细了)。不好意思代码做了点修改,现在已经没问题了,控制时间间隔和阀值都是可以自己设定的,因机器原因而导致的问题可通过调节这两个参数来匹配。

[代码]java代码:

package com.zero.lessions.recorder;import java.util.ArrayList;import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.FloatMath;public class ShakeInterface implements SensorEventListener {//检测摇动相关变量private long initTime = 0;private long lastTime = 0;private long curTime = 0;private long duration = 0;/*** 上次检测时,各分量* */private float last_x = 0.0f,last_y = 0.0f,last_z = 0.0f;/*** 本次晃动值* */private float shake = 0.0f;/*** 控制时间间隔* */private   int TimeInterval = 100;/*** 晃动阀值* */private  int shakeThreshold = 3000;private  boolean isRecoding = false;private SensorManager mSensorManager;  private ArrayList<OnShakeListener> mListeners;public ShakeInterface(Context context){mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);mListeners = new ArrayList<OnShakeListener>();}/** * 定义摇晃发生时的事件处理接口,需实现onShake方法 */  public interface OnShakeListener {  /** * 当手机摇晃时被调用 */  void onShake();  }/** * 注册OnShakeListener,当摇晃时接收通知 *  * @param listener */  public void registerOnShakeListener(OnShakeListener listener) {  if (mListeners.contains(listener))  return;  mListeners.add(listener);  }/** * 移除已经注册的OnShakeListener *  * @param listener */  public void unregisterOnShakeListener(OnShakeListener listener) {  mListeners.remove(listener);}/** * 启动摇晃检测 */  public void start() {  if (mSensorManager == null) {  throw new UnsupportedOperationException();  }  Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);  if (sensor == null) {  throw new UnsupportedOperationException();  }  boolean success = mSensorManager.registerListener(this, sensor,SensorManager.SENSOR_DELAY_GAME);if (!success) {  throw new UnsupportedOperationException();  }else{System.out.println("注册成功");}}  /** * 停止摇晃检测 */  public void stop() {  if (mSensorManager != null)  mSensorManager.unregisterListener(this);  }  @Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {//什么也不干System.out.println("精度发生变化");}//传感器数据变动事件@Overridepublic void onSensorChanged(SensorEvent event) {        //如果没有开始录音的话可以监听是否有摇动事件,如果有摇动事件可以开始录音//获取加速度传感器的三个参数float x = event.values[SensorManager.DATA_X];float y = event.values[SensorManager.DATA_Y];float z = event.values[SensorManager.DATA_Z];//获取当前时刻的毫秒数curTime = System.currentTimeMillis();if(!isRecoding){//100毫秒检测一次//System.out.println("开始变化,curtime:" + curTime +"lasttime:" + lastTime);if ((curTime - lastTime) > TimeInterval) {duration = (curTime - lastTime);// 看是不是刚开始晃动if (last_x == 0.0f && last_y == 0.0f && last_z == 0.0f) {//last_x、last_y、last_z同时为0时,表示刚刚开始记录initTime = System.currentTimeMillis();} else {//精确算法,各方向差值平方和开平方,单次晃动幅度shake = FloatMath.sqrt((x - last_x)*(x - last_x)+(y - last_y)*(y - last_y)+(z - last_z)*(z - last_z))/duration*10000;}System.out.println(shake);if(shake >= shakeThreshold){//此处开始执行this.notifyListeners();  }last_x = x;last_y = y;last_z = z;lastTime = curTime;}}}/** * 当摇晃事件发生时,通知所有的listener */private void notifyListeners() {  for (OnShakeListener listener : mListeners) {System.out.println("你执行了?");isRecoding = true;listener.onShake();  }  }public int getTimeInterval() {return TimeInterval;}public void setTimeInterval(int timeInterval) {TimeInterval = timeInterval;}public int getShakeThreshold() {return shakeThreshold;}public void setShakeThreshold(int shakeThreshold) {this.shakeThreshold = shakeThreshold;}public boolean isRecoding() {return isRecoding;}public void setRecoding(boolean isRecoding) {this.isRecoding = isRecoding;}}

使用时需要在Activity中创建ShakeInterface的对象,调用registerOnShakeListener方法,当然调用此方法时还需要实现OnShakeListener的接口,也就是具体摇晃事件发生时需要处理的动作。最后再调用start方法开启监听。别忘了在关闭Activity时注销下(即调用stop方法,我是拦截了返回按钮,退出Activity时注销滴),此外,值得注意的是,如果响应完一次摇晃动作后是不会立即响应第二次的,除非调用setRecoding(false)方法,将判断位置为false才会继续响应摇晃事件。希望我的代码对大家有帮助,谢谢。

android 类似微信的摇晃触发事件(确认可行,已封装,可直接调用)相关推荐

  1. Android类似微信详细地址选择(高德地图)

    利用高德地图的API做了一个类似微信发送位置界面地址选择,界面就3个,一个选择地址(周边搜索),一个搜索界面(关键字搜索),最后将选择的地址信息返回主界面,效果图如下:     对于详细地址选择,在项 ...

  2. android 微信摇一摇功能实现,android 类似微信的摇一摇功能实现思路及代码

    复制代码 代码如下: package com.eboy.testyaoyiyao; import java.text.SimpleDateFormat; import java.util.Date; ...

  3. 小程序监听android返回键,微信小程序左上角返回按钮触发事件

    从A页面跳转到B页面,再从B页面通过左上角返回按钮,返回到A页面 A页面: B页面: 从B页面返回到A页面时,触发事件请求接口: 代码如下: B页面js代码 onShow: function () { ...

  4. android 仿微信选取相册_Android类似微信图片选择器

    很多项目要用到图片选择控件,每次都要写一大堆逻辑.于是基于图片选择组件(PhotoPicker)封装了一个控件PhotoUploadView.方便简易,一键集成,几句代码就可以添加类似微信的图片选择控 ...

  5. Android计步模块(类似微信运动)

    最近在项目中研究计步模块,每天0点开始记录当天的步数,类似微信运动.碰到了不少坑今天有时间整理出来给大家看看. 做之前在google.baidu.github上搜了个遍没找到好的,大多数都是需要在后台 ...

  6. 微信小程序picker组件仅点击其中的内容才会触发事件

    微信小程序包括picker组件在内的好多组件默认情况下只有点击其中的文字内容才可以触发相应的事件:例如下图的性别一栏,默认情况下只有点击红色区域的"男"字才能触发picker绑定的 ...

  7. Android开发-优雅的实现动态图片排版(类似微信图片展示效果)

    介绍 效果展示 说明 上面的图片排版 - 实现了动态布局,针对不同图片的数量展示不同的排版布局.效果类似微信朋友圈的图片排版,效果略有不同. - 正方形的图片控件,高度会随着宽度一起变化. 实现这样的 ...

  8. Android 实现类似微信页面底部导航效果

    Android 实现类似微信页面底部导航效果 参考的时候需要修改的地方做一下更改,里面有一些多余的代码没有删除. .java里面的主要代码 public class MainActivity exte ...

  9. Android 锁屏,息屏情况下打开界面Activity类似微信视频通话接电话时弹出接电话的界面

    Android 锁屏,息屏情况下打开界面Activity,类似微信视频通话接电话时弹出接电话的界面 https://blog.csdn.net/yingtian648/article/details/ ...

最新文章

  1. 洛谷P1613 跑路
  2. 学完Java后只能做Java程序员吗 求职方向有哪些呢
  3. WCF分布式开发步步为赢(0):WCF学习经验分享,如何更好地学习WCF?
  4. 复工之后,如何让自己的时间更值钱
  5. 从‘一边拉琴,一边哭’,看什么是真正的兴趣
  6. 2019 年编写现代 JavaScript 代码的5个小技巧
  7. 50个常用的笔试、面试sql语句
  8. 结构体,宏,枚举,函数,指针
  9. 485通讯的校验和_RS485通讯如何实现三菱PLC对三菱变频器的控制?
  10. 节约中小企业运维成本方案
  11. 最简单的解释 webdriver的工作原理
  12. MAC直接的剪切快捷键
  13. 二进制堆的C++实现及其在机器调度(LPT)上的简单应用
  14. 我们这里最近很流行用彩色的丝带编成手环
  15. 如果你爱或者恨一个人[转]
  16. get和post详解
  17. ROS 罗技手柄控制机器人(仿真和实体机器人)
  18. 软件架构中的层次依赖
  19. 26个节省时间的Vue提示
  20. 从外网访问内网Epson爱普生无线打印机和扫描仪

热门文章

  1. CnOpenData台风数据
  2. mars-3d 台风来喽(台风的制作)
  3. Oauth2.0 认证服务器搭建
  4. psd 文件用什么打开
  5. C++/CLI标准化工作告一段落![原文发表时间:2005年9月22日]
  6. java 判断字符串是否为英文
  7. 编译原理系列之八 符号表
  8. windows 10下载安装mysql5.7
  9. 聚焦语音交互,引爆智能硬件——暨讯飞语音云沙龙杭州站成功举办
  10. 路径规划算法:基于樽海鞘算法的路径规划算法- 附代码