安卓应用开发-新手,安卓编程中处理晃动检测不会停止

问题描述

新手,安卓编程中处理晃动检测不会停止

http://pan.baidu.com/s/1skf5zv3
我写的这个apk 实现了类似真心话的功能,处理晃动是,复写了onpause,晃动检测还是没有停止,不杀掉进程,晃动检测一直在监听怎么办

解决方案

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

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

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

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

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

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

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

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

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

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

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

代码

[java] view plain copy
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 Blog
    /
    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 mListeners;
      /
      *
    • 摇晃检测阈值,决定了对摇晃的敏感程度,越小越敏感。
      /
      public int shakeThreshold = 5000;
      public ShakeDetector(Context context) {
      mContext = context;
      mSensorManager = (SensorManager) context
      .getSystemService(Context.SENSOR_SERVICE);
      mListeners = new ArrayList();
      }
      /
      *
    • 当摇晃事件发生时,接收通知
      /
      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
new一个ShakeDetector
调用mShakeDetector.registerOnShakeListener()注册一个OnShakeListener
在OnShakeListener的onShake函数中,处理摇晃事件
调用mShakeDetector.start()启动摇晃检测
mShakeDetector.stop()用于停止摇晃检测

解决方案二:

我已经实现功能了,就是监听停不下来,log调试,发现不杀掉进程,监听一直运行,怎么解决

解决方案三:

Android检测手机摇晃

Android摇晃检测ShakeDetector

时间: 2024-08-02 17:09:28

安卓应用开发-新手,安卓编程中处理晃动检测不会停止的相关文章

安卓应用开发-实现安卓应用聊天功能,该怎么建数据库

问题描述 实现安卓应用聊天功能,该怎么建数据库 新手入门安卓应用开发,要实现用户注册登录聊天等功能,需要用到网络数据库吧?该怎么入手???求指教 解决方案 需要服务器端,用jsp+mysql. 解决方案二: 基础都不会,建议你多学一下基础 解决方案三: 你试试Bmob IM吧,自带服务器的 解决方案四: 你试试Bmob IM吧,自带服务器的

安卓应用开发-关于安卓bitmap问题,困扰了好久

问题描述 关于安卓bitmap问题,困扰了好久 代码如图,我想用gallery显示bitmap出来,可是显示的图片都是一样的,为什么呢,如果说是bitmap内存没释放,我用recyle方法时候程序会闪退.求解答开发-关于安卓bitmap问题,困扰了好久-安卓开发bitmap"> 解决方案 public void GetBMP(){ LinearLayout contentLayout; contentLayout = (LinearLayout) findViewById(R.id.tes

安卓应用开发-求助 安卓开发 实在调试不出来了

问题描述 求助 安卓开发 实在调试不出来了 安卓权威编程那本书的第10章的例子 明明相等啊 为什么不等啊 UUID不相等?? toString()也不相等?? 死活不执行if里的内容 实在不会了 我用Log打印2个是否相等的内容.. 明明一样啊....... 解决方案 再补一张图 实在不会了 解决方案二: 我tm真是弱智 ==和equals都分不清 java基础都能忘

安卓应用开发-关于安卓开发,连接tomcat抛出exception

问题描述 关于安卓开发,连接tomcat抛出exception 初学者,自己写的安卓程序,用json连接tomcat,mysql数据库,结果运行时候抛出异常,求帮助! 下面是抛出的异常, 在控制台打印的结果显示除了方括号以外根本没有信息返回 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956

安卓应用开发-急需安卓通讯录,要求如下!!

问题描述 急需安卓通讯录,要求如下!! 新菜鸟,需要完成一个安卓通讯录,功能是打开是列表,列表上面有搜索功能,列表项内容是联系人和电话, 长按列表项,弹出上下文菜单,有添加联系人,编辑联系人,删除联系人,打电话,发信息这几个功能,点击进去分别完成不同功能.删除时,会有提示,确认是否删除,在编辑中,有头像项,姓名,电话,住址,生日,邮件,备注.上方有确认和取消两个按钮.头像可以选图库的,也可以调用拍照功能. 大神们,快来教教我,我不知从何下手!!! 解决方案 你把每个功能分解,逐个去找资料,都没什

安卓应用开发-求安卓软件实现填充网页框激活按钮的方法

问题描述 求安卓软件实现填充网页框激活按钮的方法 有一个网页,有密码,账号框和登陆按钮,不知道我可不可以实现用安卓软件来自动填充账号和密码框,并软件自动点击登陆啊? 解决方案 这个应该可以实现,需要得到它的位置.

安卓应用开发-安卓新手求教类的问题

问题描述 安卓新手求教类的问题 最近学习安卓蓝牙开发,看到如下代码,ba = BluetoothAdapter.getDefautAdapter(),以前学c++感觉函数调用都是用对象来调用,而BluetoothAdapter是个类,没实例化,为啥可以这么用? 解决方案 getDefautAdapter()在这个内部肯定有实例化的. 看java设计模式之工厂模式 解决方案二: 由于 BT 是一个硬件,不可能被多个实例!所以,不能给每个应用都来实例化.getDefautAdapter 中引用 BT

安卓 app 形状 绘制-请教,安卓app开发中,能用代码绘制一个纯文本意义的纯色的胶囊形状吗

问题描述 请教,安卓app开发中,能用代码绘制一个纯文本意义的纯色的胶囊形状吗 请教,安卓app开发中,能用代码绘制一个纯文本意义的纯色的胶囊形状吗,还是要用png图片代替呢,各有什么有缺点呢 解决方案 可以直接画,定义圆角的弧度,其他用纯色填充,形如: radius就是角度 字面意思比较清楚,你看看 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://s

软件开发-安卓,jsoup,解析网页中的javascript的内容,提取信息

问题描述 安卓,jsoup,解析网页中的javascript的内容,提取信息 开发-安卓,jsoup,解析网页中的javascript的内容,提取信息-jsoup解析javascript"> 这个是网页地址:http://www.bilibili.com/mobile/subchannel.html#tid=33 以下是抓取到的网页源码,以图片发出,实在不好意思了,可是好像因为这个而发不出来了,现在安全起见还是以图片的形式发出,或者可以上该链接获取,我是用ie仿真为windows phon