关于android “shake shake 摇摆 摇摆”的实现与优化
2010-09-29 01:32:00 来源:WEB开发网我们知道,在用户摇摆手机的时候,不可能速度的最大值是你设定的临界值,一般情况是,在到达临界值之后,速度还会增长,如果不加以控制的话,这个动作可能会被连续的执行
在不加控制的情况下,我试验的结果是:我的intent基本平均要被执行3-5次……
如何解决这个问题呢?或许我的解决方案没有普适性,因为我并没有 完全基于在一个activity里面解决问题,但是可以供参考~因为我们要做的很多意图都是activity之间切换
在监听判断时 加入一个boolean 标志 ,常态下为true ,在打开(动作发生)后,置为flase,在(动作打开)的activity被销毁后,再置为true,这里需要用到activityForResult
如:intent.setClass(HelloBear.this, ChooseBear.class);
HelloBear.this.startActivityForResult(intent, 0);
然后在onActivityResult中置标志为常态
问题得以解决
最后,贴一下,实现shake的核心代码~基本和javaeye上的一样,只是进行了上述优化(这个算法本身很简单很直观但是很SB~我希望找到更强大的算法)
public void onSensorChanged(int sensor,float[] values)
{
if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
long curTime = System.currentTimeMillis();
// 每10毫秒检测一次
if ((curTime - lastUpdate) > 100) {
long diffTime = (curTime - lastUpdate);
lastUpdate = curTime;
x = values[SensorManager.DATA_X];
y = values[SensorManager.DATA_Y];
z = values[SensorManager.DATA_Z];
float speed = Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000;
if (speed > SHAKE_THRESHOLD&& shakable ==true )
{
Intent intent = new Intent();
intent.setClass(HelloBear.this, ChooseBear.class);
HelloBear.this.startActivityForResult(intent, 0);
shakable = false;
cancelDelayHide();
}
last_x = x;
last_y = y;
last_z = z;
}
}
}
更多精彩
赞助商链接