`

【Android】检测手机摇晃

阅读更多


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

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

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

 

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

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

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

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

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

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

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

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

 

代码

 

package zhengzhiren.android.hardware;
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;
/**
 * 用于检测手机摇晃
 * 
 * @author 郑智仁
 * @see <a href="http://blog.csdn.net/zhengzhiren" mce_href="http://blog.csdn.net/zhengzhiren">Blog</a>
 */
public class ShakeDetector implements SensorEventListener {
	/**
	 * 检测的时间间隔
	 */
	static final int UPDATE_INTERVAL = 100;
	/**
	 * 上一次检测的时间
	 */
	long mLastUpdateTime;
	/**
	 * 上一次检测时,加速度在x、y、z方向上的分量,用于和当前加速度比较求差。
	 */
	float mLastX, mLastY, mLastZ;
	Context mContext;
	SensorManager mSensorManager;
	ArrayList<OnShakeListener> mListeners;
	/**
	 * 摇晃检测阈值,决定了对摇晃的敏感程度,越小越敏感。
	 */
	public int shakeThreshold = 5000;
	public ShakeDetector(Context context) {
		mContext = context;
		mSensorManager = (SensorManager) context
				.getSystemService(Context.SENSOR_SERVICE);
		mListeners = new ArrayList<OnShakeListener>();
	}
	/**
	 * 当摇晃事件发生时,接收通知
	 */
	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();
		}
	}
	/**
	 * 停止摇晃检测
	 */
	public void stop() {
		if (mSensorManager != null)
			mSensorManager.unregisterListener(this);
	}
	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {
		// TODO Auto-generated method stub
	}
	@Override
	public void onSensorChanged(SensorEvent event) {
		long currentTime = System.currentTimeMillis();
		long diffTime = currentTime - mLastUpdateTime;
		if (diffTime < UPDATE_INTERVAL)
			return;
		mLastUpdateTime = currentTime;
		float x = event.values[0];
		float y = event.values[1];
		float z = event.values[2];
		float deltaX = x - mLastX;
		float deltaY = y - mLastY;
		float deltaZ = z - mLastZ;
		mLastX = x;
		mLastY = y;
		mLastZ = z;
		float delta = FloatMath.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ
				* deltaZ)
				/ diffTime * 10000;
		if (delta > shakeThreshold) { // 当加速度的差值大于指定的阈值,认为这是一个摇晃
			this.notifyListeners();
		}
	}
	/**
	 * 当摇晃事件发生时,通知所有的listener
	 */
	private void notifyListeners() {
		for (OnShakeListener listener : mListeners) {
			listener.onShake();
		}
	}
}
  
如何使用ShakeDetector
  1. new一个ShakeDetector
  2. 调用mShakeDetector.registerOnShakeListener()注册一个OnShakeListener
  3. 在OnShakeListener的onShake函数中,处理摇晃事件
  4. 调用mShakeDetector.start()启动摇晃检测
  5. mShakeDetector.stop()用于停止摇晃检测

 

分享到:
评论

相关推荐

    Android手机摇晃检测简单例子 (源码)

    在Android平台上,开发一款能够检测手机摇晃的应用是一项常见的任务,尤其在游戏或者互动应用中。这个"Android手机摇晃检测简单例子(源码)"就是这样一个实例,它提供了源代码,帮助开发者理解如何实现这一功能。...

    ANDROID手机摇晃检测简单例子

    在Android平台上,手机摇晃检测是一项常见的功能,用于实现各种互动操作,比如游戏中的操作反馈、应用切换等。本教程将详细介绍如何实现一个简单的手机摇晃检测程序,当用户摇晃手机时,屏幕颜色会从全白色变为显示...

    Android实现检测手机摇晃的监听器

    android 检测手机摇晃的监听器,实现代码如下所示: public class ShakeListener implements SensorEventListener { // 速度阈值,当摇晃速度达到这值后产生作用 private static final int SPEED_SHRESHOLD = ...

    android 实现手机摇晃摆动效果

    本文将深入探讨如何在Android平台上创建一个手机摇晃摆动效果。 首先,我们需要了解的是Android传感器(Sensor)系统。Android系统提供了SensorManager服务,用于管理设备上的各种传感器,例如加速度计,陀螺仪等。...

    android_利用重力感应检测摇晃手机的速度.doc

    总的来说,这个文档提供了一个基础的示例,展示了如何利用Android的重力感应器来检测手机的摇晃速度,并根据速度判断是否执行特定的操作。通过这个技术,开发者可以创建出更加互动和有趣的移动应用,如音乐播放器、...

    android 摇晃手机和双击屏幕截屏

    在Android开发中,实现"摇晃手机截屏"和"双击屏幕截屏"功能是一项实用的技术,可以为用户带来便捷的操作体验。本项目通过提供一个可直接运行的Android应用,展示了这两种截屏方式的实现过程。下面我们将详细探讨这两...

    android开发摇晃手机扫描二维码

    在Android开发中,实现摇晃手机来扫描二维码是一项有趣且实用的功能。这个功能结合了运动感应和二维码识别技术,使得用户无需打开相机界面手动对准二维码,只需轻轻一摇,即可快速扫描。以下是对这个项目的详细解读...

    Android的SensorEventListener例子(摇晃手机)

    在这个例子中,我们将聚焦于如何通过实现SensorEventListener来检测手机的摇晃动作。 首先,我们需要在AndroidManifest.xml文件中添加对传感器权限的请求: ```xml &lt;uses-permission android:name="android....

    Android-android-shake-detector检测设备的晃动

    在Android应用开发中,有时我们需要实现一种功能,即检测用户设备的晃动行为,例如用于游戏、健身应用或任何需要用户交互的创新功能。"Android-shake-detector" 是一个专门为这种需求设计的工具类库,它能帮助开发者...

    Shake-Detector:检测何时已摇晃android手机

    震动探测器 这是Android设备上易于使用的震动检测器库 用法实际上是4行代码执行将jitpack添加到存储库allprojects { repositories { ... maven { url 'https://jitpack.io' } }}添加依赖项implementation '...

    Android代码-模拟摇一摇手机自动刷计步器步数的Xposed模块

    在Android平台上,开发者可以利用各种传感器来获取设备的实时数据,例如加速度传感器可以用于检测用户的运动状态,比如步行、跑步等。Xposed框架则是一个强大的工具,它允许开发者在系统层面修改Android应用的行为,...

    andorid-背景改变摇晃手机感应.rar

    在Android平台上,开发一款应用能够根据用户摇晃手机的动作来改变背景是一个有趣且实用的功能。这个"andorid-背景改变摇晃手机感应"压缩包文件包含了一个实现此类功能的项目,下面将详细介绍相关的Android开发知识和...

    安卓Android源码——手机摇一摇DEMO代码,实现摇一摇执行特定程序.zip

    在安卓(Android)平台上,开发人员经常利用各种传感器来增强用户体验,其中“手机摇一摇”功能就是一个典型的例子。这个DEMO代码展示了如何通过监听设备的运动传感器来检测用户摇动手机的动作,并根据该动作执行...

    Android 甩动检测

    在Android平台上,"甩动检测"(通常称为Shake Detection)是一种常见的手势识别功能,它允许用户通过摇晃设备来触发特定的操作。在本案例中,我们特别关注的是将其应用于音乐播放器,使得用户可以通过简单的摇晃手机...

    Android应用源码之Android摇一摇功能示例源码-IT计算机-毕业设计.zip

    当用户摇晃手机时,加速度传感器会检测到设备在三个轴向(X、Y、Z)上的加速度变化。通过设定一个阈值和时间间隔,可以判断出用户的摇晃动作。 实现摇一摇功能主要包括以下几个步骤: 1. **权限声明**:在...

    android 摇摆效果shake SensorListener

    这就是一个基本的摇晃检测实现,通过结合SensorListener和加速度传感器,我们可以检测到用户的手机摇晃动作,并据此执行相应的功能,比如弹出Dialog。在实际应用中,可能需要根据设备的不同和用户的习惯来调整阈值和...

    android手机传感器简介

    在通话时,它可以检测手机是否靠近脸部,从而关闭屏幕显示,防止误操作。 8. **Sensor.TYPE_TEMPERATURE** - 温度传感器测量设备的温度,单位是摄氏度。这可能是指电池温度或传感器本身的温度,具体取决于手机型号...

    delphi IOS android 手机摇一摇 控件.rar

    Delphi 控件通过利用这些API,监测手机的加速度变化,当检测到特定的运动模式(类似摇晃)时,触发预定义的事件。 2. **Delphi 的跨平台支持**:Delphi 使用 FireMonkey 框架,实现了真正的跨平台UI设计和编程。这...

    Android最新资料以及源码

    共两个目标文件,检测手机摇晃的监听器(设置重力感应监听器感应获得变化数据)。 6、Android 音乐快剪2.2源码(含文档) 共14个目标文件,具备录音、编辑音频文件……等。 7、android_gps_wifi_基站_定位集合 如...

Global site tag (gtag.js) - Google Analytics