(安卓)手机摇晃检测。

做游戏的时候,一般都要使用到多种多样的传感器,以实现比较丰富的UI 互动,比如检测手机的晃动。

如何检测手机的摇晃和摇晃程度呢?

找了些资料,并加以改进,将此功能封装成类(ShakeDetector),方便今后使用。

http://blog.csdn.net/ZhengZhiRen/archive/2010/10/09/5930451.aspx

摇晃检测基于加速传感器(Sensor.TYPE_ACCELEROMETER)。

由于重力的存在,当手机静止放于桌面时,加速传感器也是有加速度的。

所以,仅通过是否有加速度来判断摇晃是不行的。

那么,判断加速度的变化吧。。。

在一个较短的时间间隔求出加速度的差值,跟一个指定的阈值比较,如果差值大于阈值,则认为是摇晃发生了。

ClingMarks的方法将x、y、z方向的加速度差值简单的加起来,我认为不是很准确。

加速度是向量,求差应该是各方向的差值平方后相加,再开方。(数学忘光了,没记错吧。。。)

监听摇晃手机的类:

/**
* @author renxinwei
*
* @date 2013-1-17 下午09:19:58
*/
public class SensorManagerHelper implements SensorEventListener {

// 速度阈值,当摇晃速度达到这值后产生作用
private static final int SPEED_SHRESHOLD = 5000;
// 两次检测的时间间隔
private static final int UPTATE_INTERVAL_TIME = 50;
// 传感器管理器
private SensorManager sensorManager;
// 传感器
private Sensor sensor;
// 重力感应监听器
private OnShakeListener onShakeListener;
// 上下文对象context
private Context context;
// 手机上一个位置时重力感应坐标
private float lastX;
private float lastY;
private float lastZ;
// 上次检测时间
private long lastUpdateTime;
// 构造器
public SensorManagerHelper(Context context) {
// 获得监听对象
this.context = context;
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;
}

/*
* (non-Javadoc)
* android.hardware.SensorEventListener#onAccuracyChanged(android.hardware
* .Sensor, int)
*/
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}

/*
* 重力感应器感应获得变化数据
* android.hardware.SensorEventListener#onSensorChanged(android.hardware
* .SensorEvent)
*/
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
// 现在检测时间
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();
}
}

在Activity中使用:

SensorManagerHelper sensorHelper = new SensorManagerHelper(this);
sensorHelper.setOnShakeListener(new OnShakeListener() {

@Override
public void onShake() {
// TODO Auto-generated method stub
System.out.println("shake");
Toast.makeText(MainActivity.this, "你在摇哦", Toast.LENGTH_SHORT).show();
}
});

时间: 2024-10-10 01:15:59

(安卓)手机摇晃检测。的相关文章

Android摇晃检测ShakeDetector

</pre><pre name="code" class="java"><span style="font-family: Arial; background-color: rgb(255, 255, 255);"><span style="font-size:18px;">最近做一个程序要实现一个Shake手机的特性.</span></span> 想到这

【转】安卓手机有安全模式?安卓4.1安全模式介绍

原文网址:http://samsung.tgbus.com/201207/442962.shtml 在每个安卓用户的眼中安全模式的概念都是非常模糊的,常见的安卓模式一般都是电脑中才会出现的.可能有人会问,安卓手机有安全模式么?在Windows系统中,安全模式的工作原理是在不加载第三方设备驱动程序的情况下启动电脑,使电脑运行在系统最小模式,这样用户就可以方便地检测与修复计算机系统的错误.那么安卓手机安全模式是什么意思呢?安卓手机安全模式怎么开?下面让我们一起来看Android 4.1安全模式介绍.

安卓手机ADB驱动干什么的?

Adb驱动是什么意思? /div> Adb是英文Android Debug Bridge的英文缩写,是debug工具,如果不是写IT的可能也很难理解debug的意思.说的直白一点就是Adb就是手机与电脑相连的桥,要想用电脑调试和管理手机就必须先安装Adb工具包,我们借助adb工具可以在电脑上给手机安装软件,运行shell命令,系统升级. 查看更多关于Adb驱动 .. 如何安装Adb驱动? 早些年我们在玩智能手机的时候安装adb驱动都需要在国外的一些网站上去找adb驱动程序,然后安装在电脑上连接手

Kali环境使用Metasploit生成木马入侵安卓手机

Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,提供真正的安全风险情报.这些功能包括智能开发,代码审计,Web应用程序扫描,社会工程.团队合作,在Metasploit和综合报告提出了他们的发现. 环境准备: Kali2.0(msfVENOM.metasploit)安卓手机或安卓模拟器 利用过程: 先查看本地IP地址 使用msfvenom生成apk木马 1 msfvenom -p android/met

微信和QQ消息撤回可见app(仅限安卓手机系统的童鞋哟,本人亲测有效)

这款软件仅1.6MB,并不会占用太多的空间,给予所需的权限,并开启监听撤回之后,不管你锁没锁屏,都可以记录被撤回的消息,不过经测试成功率不是百分百,多次测试排除后得知,被屏蔽的群消息,不会有屏幕提示的是无法检测的.如果群没有被屏蔽,也是可以被抓取撤回的.至于图片,测试结果就是只会告诉你撤回了图片,并没办法抓取撤回的图片像素.仅限安卓手机系统适用哦! 软件下载地址: 链接:https://pan.baidu.com/s/1jVD-TXGjMurlreHIp4bHsQ 提取码:t0km 复制这段内容

解决安卓手机键盘弹出时会把背景或百分比定位的布局压缩的问题

做移动端页面时经常遇到以下案例,在有背景的页面上写表单,而且底部为了适应不同手机还得运用绝对定位,因为通常是把容器高度设为了100%,这时在安卓手机上弹窗软键盘时就会把背景图片及其他东西挤压上去,解决方法如下: 在css样式中把大容器定义为fixed布局 .wrap{ position:fixed;left:0;top:0; } 在js中强制把页面的高度覆给他,就相当于自动撑开 var x =document.body.clientWidth; //查询设备的宽度 var y =document

如何使用电脑上的谷歌浏览器来调试安卓手机上的移动端页面

本教程用的是我自己的手机三星A9,其他安卓手机方法也相同. 第一步首先你得打开手机的开发者选项,确保USB调试和通过USB验证应用程序保持打开状态,如图所示 第二步,确保你的电脑和安卓手机都已经安装了谷歌浏览器 第三步,打开你电脑的上谷歌浏览器,调出控制台,,点击如图所示这个3旁边的3个点,这里面有更多的功能,会出现这个选项,我们点击More tools,再选择,在之后的页面中如图所示的选项必须打钩,然后用你数据链连接你的电脑和手机,手机就会弹出一个连接提示,你点是就可以了,连接成功就会跟上图中

安卓手机屏幕投射到电脑以及一台电脑控制多台手机技术原理浅析

奥创软件研究院推出的奥创微群控让越来越多的人了解到了电脑控制手机的操作.自奥创软件研究院首家发布电脑批量控制手机的解决方案以来,有很多人开始探讨电脑控制手机技术在实际工作中的应用. 由于市场太大,仅靠奥创软件研究院一家也是做不过来的,现在将手机屏幕投射到到电脑的技术原理,以及一台电脑批量控制多台手机的技术(即所谓的手机反响控制)简单的给大家介绍下,在此抛砖引玉,希望能给大家一些思路上的指导. 说到安卓手机的屏幕投射,就不得不说安卓的adb,ADB的全称为Android Debug Bridge这

安卓手机APP压力monkey测试

一.Monkey概述 Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进行压力测试.Monkey测试是一种为了测试软件的稳定性.健壮性的快速有效的方法.Monkey测试是Android平台下自动化测试的一种快速有效的手段. 二.环境配置 JDK配置:根据自己的电脑系统位数,选择适当的JDK,若自己电脑系统是32位,尽量也选择使用32位的JDK,在此以此为例进行详解.JDK