监听手机晃动(摇一摇)SensorEventListener
- import android.content.Context;
 - import android.hardware.Sensor;
 - import android.hardware.SensorEvent;
 - import android.hardware.SensorEventListener;
 - import android.hardware.SensorManager;
 - /**
 - *
 - * 一个检测手机摇晃的监听器
 - * @author fuzhengchao
 - *
 - */
 - public class ShakeListener implements SensorEventListener {
 - //速度阈值,当摇晃速度达到这值后产生作用
 - private static final int SPEED_SHRESHOLD = 4000;
 - //两次检测的时间间隔
 - private static final int UPTATE_INTERVAL_TIME = 70;
 - //传感器管理器
 - private SensorManager sensorManager;
 - //传感器
 - private Sensor sensor;
 - //重力感应监听器
 - private OnShakeListener onShakeListener;
 - //上下文
 - private Context context;
 - //手机上一个位置时重力感应坐标
 - private float lastX;
 - private float lastY;
 - private float lastZ;
 - //上次检测时间
 - private long lastUpdateTime;
 - //构造器
 - public ShakeListener(Context c) {
 - //获得监听对象
 - context = c;
 - start();
 - }
 - //开始
 - public void start() {
 - //获得传感器管理器
 - sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
 - if(sensorManager != null) {
 - //获得重力传感器
 - sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
 - }
 - //注册
 - if(sensor != null) {
 - sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);
 - }
 - }
 - //停止检测
 - public void stop() {
 - sensorManager.unregisterListener(this);
 - }
 - //摇晃监听接口
 - public interface OnShakeListener {
 - public void onShake();
 - }
 - //设置重力感应监听器
 - public void setOnShakeListener(OnShakeListener listener) {
 - onShakeListener = listener;
 - }
 - //重力感应器感应获得变化数据
 - public void onSensorChanged(SensorEvent event) {
 - //现在检测时间
 - long currentUpdateTime = System.currentTimeMillis();
 - //两次检测的时间间隔
 - long timeInterval = currentUpdateTime - lastUpdateTime;
 - //判断是否达到了检测时间间隔
 - if(timeInterval < UPTATE_INTERVAL_TIME)
 - return;
 - //现在的时间变成last时间
 - lastUpdateTime = currentUpdateTime;
 - //获得x,y,z坐标
 - float x = event.values[0];
 - float y = event.values[1];
 - float z = event.values[2];
 - //获得x,y,z的变化值
 - float deltaX = x - lastX;
 - float deltaY = y - lastY;
 - float deltaZ = z - lastZ;
 - //将现在的坐标变成last坐标
 - lastX = x;
 - lastY = y;
 - lastZ = z;
 - double speed = Math.sqrt(deltaX*deltaX + deltaY*deltaY + deltaZ*deltaZ)/timeInterval * 10000;
 - //达到速度阀值,发出提示
 - if(speed >= SPEED_SHRESHOLD)
 - onShakeListener.onShake();
 - }
 - public void onAccuracyChanged(Sensor sensor, int accuracy) {
 - }
 - }
 
用法:
- ShakeListener shakeListener = new ShakeListener(this);//创建一个对象
 - shakeListener.setOnShakeListener(new OnShakeListener(){//调用setOnShakeListener方法进行监听
 - public void onShake() {
 - //对手机摇晃后的处理(如换歌曲,换图片,震动……)
 - //onVibrator();
 - }
 - });
 
//震动
- private void onVibrator() {
 - Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
 - if (vibrator == null) {
 - Vibrator localVibrator = (Vibrator) context.getApplicationContext()
 - .getSystemService("vibrator");
 - vibrator = localVibrator;
 - }
 - vibrator.vibrate(100L);
 - }
 
摇一摇精简代码实现 
http://blog.sina.com.cn/s/blog_66cfbaa5010120w8.html
Android中类似于奇虎360手机卫士中摇一摇效果实现 
http://blog.csdn.net/nono_love_lilith/article/details/7554341
监听手机晃动(摇一摇)SensorEventListener的更多相关文章
- 用BroadcastReceiver监听手机网络状态变化
		
android--解决方案--用BroadcastReceiver监听手机网络状态变化 标签: android网络状态监听方案 2015-01-20 15:23 1294人阅读 评论(3) 收藏 举报 ...
 - Android监听手机网络变化
		
Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...
 - Android初级教程使用服务注册广播接收者监听手机解锁屏变化
		
之前第七章广播与服务理论篇写到: 特殊的广播接收者(一般发广播次数频率很高) 安卓中有一些广播接收者,必须使用代码注册,清单文件注册是无效的 屏幕锁屏和解锁 电量改变 今天在这里就回顾一下,且用代码方 ...
 - iOS 关于监听手机截图,UIView生成UIImage, UIImage裁剪与压缩的总结
		
一. 关于监听手机截图 1. 背景: 发现商品的售价页总是被人转发截图,为了方便用户添加截图分享的小功能 首先要注册用户截屏操作的通知 - (void)viewDidLoad { [super vi ...
 - vue 监听手机键盘是否弹出及input是否聚焦成功
		
//定义移动端类型 function pageStats() { let u = navigator.userAgent, app = navigator.appVersion; let obj = ...
 - 知识点---js监听手机返回键,回到指定界面
		
方法一. $(function(){ pushHistory(); window.addEventListener(“popstate”, function(e) { window.location ...
 - 使用ionic开发时用遇到监听手机返回按钮的问题~
		
当时用的是ionic开发一个app,需求是,当按下手机的返回按钮,在指定的页面双击退出,而在其他页面点击一次返回到上个页面: 其实用ionic自带的服务就可以解决: //双击退出 $ionicP ...
 - JavaScript监听手机物理返回键的两种解决方法
		
JavaScript没有监听物理返回键的API,所以只能使用 popstate 事件监听. 有两个解决办法: 1.返回到指定的页面 pushHistory(); window.addEventList ...
 - 监听 手机back键和顶部的回退
		
// 回退事件,监听 手机back键和顶部的回退 pushHistory(); window.addEventListener("popstate", function(e) { ...
 
随机推荐
- 多少遍ner让他加56看6
			
http://www.huihui.cn/share/8112372 http://www.huihui.cn/share/8112363 http://www.huihui.cn/share/811 ...
 - Windows failed to start.界面下修复win8引导
			
首先要保证 系统本身是没有问题的 不是在装机的时候出现这种情况 那么可以按照以下方法来进行 首先要在另外一台电脑上将win8刻进u盘 启动时以u盘为第一启动项启动 进入win8装机界面 点击左下角的修 ...
 - POJ 1330 Nearest Common Ancestors LCA题解
			
Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19728 Accept ...
 - ADS2008 安装方法详解及文件下载
			
一.我的安装的过程及方法 正常安装的方法: 1.- Install the program. 2.- Copy "license.lic" into "C:\ADS200 ...
 - Visual Studio 创建和使用dll的方法
			
DLL是一个包含可由多个程序同时使用的代码和数据的库. DLL文件就是把一些函数导出来,然后在新程序中进行复用的过程. 第一部分:使用Visual Studio 2010进行DLL的制作 生成方法一: ...
 - POJ 3528 求三维凸包表面积
			
也是用模板直接套的题目诶 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include < ...
 - ZOJ 1450 Minimal Circle 最小圆覆盖
			
套了个模板直接上,貌似没有随机化序列 QAQ //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #in ...
 - 基于visual Studio2013解决C语言竞赛题之0605strcat
			
  题目
 - BZOJ 1499 NOI2005 瑰丽华尔兹 单调队列
			
题目大意:给定一个m*n的地图,一些点有障碍物,钢琴初始在一个点,每一个时间段能够选择向给定的方向移动一段距离,求最长路径长 朴素DP的话,我们有T个时间段,每一个时间段有m*n个点,n个时间,一定会 ...
 - activity变成Dialog的样式设置
			
1.属性解析 <item name="android:windowFrame">@null</item> :Dialog的windowFrame框为无< ...