安卓:抖动检测器过于敏感 [英] Android: Shake Detector too Sensitive
本文介绍了安卓:抖动检测器过于敏感的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我试图来检测抖动 - 我用下面的code, 它的工作原理非常好,但在某些设备(GALAXY NOTE 2为例)检测到的抖动太快(在某些情况下 - 当我只是拿着手机仍然)
main.java:
ShakeListener mShaker =新ShakeListener(本);
mShaker.setOnShakeListener(新ShakeListener.OnShakeListener(){
公共无效onShake()
{
//有些code ...
}
});
}
ShakeListener.java:
包com.my.app;
进口android.hardware.Sensor;
进口android.hardware.SensorEvent;
进口android.hardware.SensorEventListener;
进口android.hardware.SensorManager;
进口android.widget.Toast;
进口android.content.Context;
进口java.lang.UnsupportedOperationException;
公共类ShakeListener实现SensorEventListener
{
私有静态最终诠释FORCE_THRESHOLD = 700;
私有静态最终诠释TIME_THRESHOLD = 100;
私有静态最终诠释SHAKE_TIMEOUT = 500;
私有静态最终诠释SHAKE_DURATION = 1000;
私有静态最终诠释SHAKE_COUNT = 5;
私人的SensorManager mSensorMgr;
私人浮动mLastX = -1.0F,mLastY = -1.0F,mLastZ = -1.0F;
专用长mLastTime;
私人OnShakeListener mShakeListener;
私人语境mContext;
私人诠释mShakeCount = 0;
专用长mLastShake;
专用长mLastForce;
公共接口OnShakeListener
{
公共无效onShake();
}
公共ShakeListener(上下文的背景下)
{
mContext =背景;
恢复();
}
公共无效setOnShakeListener(OnShakeListener监听器)
{
mShakeListener =侦听器;
}
公共无效简历(){
mSensorMgr =(的SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);
如果(mSensorMgr == NULL){
抛出新UnsupportedOperationException异常(传感器不支持);
}
布尔支持= FALSE;
尝试 {
支持= mSensorMgr.registerListener(这一点,mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_GAME);
}赶上(例外五){Toast.makeText(mContext,抖不支持,Toast.LENGTH_LONG).show();}
如果((支持)及!及(mSensorMgr = NULL)!)mSensorMgr.unregisterListener(本);
}
公共无效暂停(){
如果(mSensorMgr!= NULL){
mSensorMgr.unregisterListener(本);
mSensorMgr = NULL;
}
}
公共无效onAccuracyChanged(传感器传感器,诠释精度){}
公共无效onSensorChanged(SensorEvent事件)
{
如果(event.sensor.getType()!= Sensor.TYPE_ACCELEROMETER)
返回;
长今= System.currentTimeMillis的();
如果((现 - mLastForce)> SHAKE_TIMEOUT){
mShakeCount = 0;
}
如果((现 - mLastTime)> TIME_THRESHOLD){
长差异=现在 - mLastTime;
浮速度= Math.abs(event.values [0] + event.values [1] + event.values [2] - mLastX - mLastY - mLastZ)/差异* 10000;
如果(速度> FORCE_THRESHOLD){
如果((++ mShakeCount> = SHAKE_COUNT)及及(现在 - mLastShake> SHAKE_DURATION)){
mLastShake =现在;
mShakeCount = 0;
如果(mShakeListener!= NULL){
mShakeListener.onShake();
}
}
mLastForce =现在;
}
mLastTime =现在;
mLastX = event.values [0];
mLastY = event.values [1];
mLastZ = event.values [2];
}
}
}
解决方案
检查加速具有更高一些抖动。看看这个code它为我工作。
私人最终SensorEventListener mSensorListener =新SensorEventListener(){
公共无效onSensorChanged(SensorEvent SE){
浮X = se.values [0];
浮Y = se.values [1];
浮Z = se.values [2];
mAccelLast = mAccelCurrent;
mAccelCurrent =(浮动)的Math.sqrt((双)(X * X + Y * Y + Z * Z));
浮动三角洲= mAccelCurrent - mAccelLast;
mAccel = mAccel * 0.9F +增量; //执行低切滤波器
如果(mAccel→8){
Toast.makeText(getApplicationContext(),
你已经动摇了你的电话,Toast.LENGTH_SHORT).show();
}
}
公共无效onAccuracyChanged(传感器传感器,诠释精度){
Log.i(传感器,mAccel+ mAccel);
}
};
I'm trying to detect a shake - and i'm using the following code, it works very good, but in some devices (Galaxy note 2 for example) it detects the shake too soon (in some cases - when i just hold the phone still)
main.java:
ShakeListener mShaker = new ShakeListener(this);
mShaker.setOnShakeListener(new ShakeListener.OnShakeListener () {
public void onShake()
{
// Some code...
}
});
}
ShakeListener.java :
package com.my.app;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.widget.Toast;
import android.content.Context;
import java.lang.UnsupportedOperationException;
public class ShakeListener implements SensorEventListener
{
private static final int FORCE_THRESHOLD = 700;
private static final int TIME_THRESHOLD = 100;
private static final int SHAKE_TIMEOUT = 500;
private static final int SHAKE_DURATION = 1000;
private static final int SHAKE_COUNT = 5;
private SensorManager mSensorMgr;
private float mLastX=-1.0f, mLastY=-1.0f, mLastZ=-1.0f;
private long mLastTime;
private OnShakeListener mShakeListener;
private Context mContext;
private int mShakeCount = 0;
private long mLastShake;
private long mLastForce;
public interface OnShakeListener
{
public void onShake();
}
public ShakeListener(Context context)
{
mContext = context;
resume();
}
public void setOnShakeListener(OnShakeListener listener)
{
mShakeListener = listener;
}
public void resume() {
mSensorMgr = (SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);
if (mSensorMgr == null) {
throw new UnsupportedOperationException("Sensors not supported");
}
boolean supported = false;
try {
supported = mSensorMgr.registerListener(this, mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
} catch (Exception e) {Toast.makeText(mContext, "Shaking not supported", Toast.LENGTH_LONG).show();}
if ((!supported)&&(mSensorMgr != null)) mSensorMgr.unregisterListener(this);
}
public void pause() {
if (mSensorMgr != null) {
mSensorMgr.unregisterListener(this);
mSensorMgr = null;
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) { }
public void onSensorChanged(SensorEvent event)
{
if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
return;
long now = System.currentTimeMillis();
if ((now - mLastForce) > SHAKE_TIMEOUT) {
mShakeCount = 0;
}
if ((now - mLastTime) > TIME_THRESHOLD) {
long diff = now - mLastTime;
float speed = Math.abs(event.values[0] + event.values[1] + event.values[2] - mLastX - mLastY - mLastZ) / diff * 10000;
if (speed > FORCE_THRESHOLD) {
if ((++mShakeCount >= SHAKE_COUNT) && (now - mLastShake > SHAKE_DURATION)) {
mLastShake = now;
mShakeCount = 0;
if (mShakeListener != null) {
mShakeListener.onShake();
}
}
mLastForce = now;
}
mLastTime = now;
mLastX = event.values[0];
mLastY = event.values[1];
mLastZ = event.values[2];
}
}
}
解决方案
Check Acceleration with higher number of shake. Take a Look on this code it works for me.
private final SensorEventListener mSensorListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent se) {
float x = se.values[0];
float y = se.values[1];
float z = se.values[2];
mAccelLast = mAccelCurrent;
mAccelCurrent = (float) Math.sqrt((double) (x * x + y * y + z * z));
float delta = mAccelCurrent - mAccelLast;
mAccel = mAccel * 0.9f + delta; // perform low-cut filter
if (mAccel > 8) {
Toast.makeText(getApplicationContext(),
"You have shaken your phone", Toast.LENGTH_SHORT).show();
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
Log.i("Sensor", "mAccel" + mAccel);
}
};
这篇关于安卓:抖动检测器过于敏感的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文