[オリジナル]androidでshakeの動作検出を実現する方法-part 1
新型の携帯電話は現在、3次元ルール加速器(accelerometer)が加わっているため、ジェスチャー/動作の検出もモバイルアプリケーション開発の一部となっている.例えば、描いた絵を消したいなら、携帯を軽く振ってcanvasのgraphicsを消すことができます.初めて見たのは07年に脱獄したiPhoneのSketchUpというソフトです.あとはtodo listで、完成したアイテムは、軽く振って自動的に削除されます.
どのようにshakeの動作を検出するかは実は多くのapproachがあって、1つはClingMarksが書いたブログで言及したことがあります.基本的にx,y,zの3つを
軸上の距離の変化をすべて加算、間隔の時間を除いて速度を算出し、この速度がある値より大きい場合、shake動作となる.個人的にはこの公式にばらつきがあると思いますが、場合によってはshake以外の動作もshakeとして検出されます.そしてあなたはどの方向にこのshake動作が発生したのか分かりません.だから私はこのモードcoarse-grainと呼んで、とても粗いです.しかし、もしあなたがshakeの具体的な詳細に関心を持っていないならば、ただshakeの動作かどうかを知りたいだけで、これはもう十分だと思います.
あなたのActivityでは、このSensorListenerをimplementします.
SensorManagerを取得する必要があります
次に、このセンサーが取得する必要があるデータのflagsを登録します.
あなたのonSensorChange()メソッドでは、shakeの動作を決定するためにこの粗い式があります.
このshakeの速度臨界点値は、次のように定義されます.
この実現は実は簡単だ.私の次の投稿では、比較的繊細な検出方法を紹介し、iPhone開発で学んだ心得でもあります.
本帖例のソースコードは添付ファイルにあります.
どのようにshakeの動作を検出するかは実は多くのapproachがあって、1つはClingMarksが書いたブログで言及したことがあります.基本的にx,y,zの3つを
軸上の距離の変化をすべて加算、間隔の時間を除いて速度を算出し、この速度がある値より大きい場合、shake動作となる.個人的にはこの公式にばらつきがあると思いますが、場合によってはshake以外の動作もshakeとして検出されます.そしてあなたはどの方向にこのshake動作が発生したのか分かりません.だから私はこのモードcoarse-grainと呼んで、とても粗いです.しかし、もしあなたがshakeの具体的な詳細に関心を持っていないならば、ただshakeの動作かどうかを知りたいだけで、これはもう十分だと思います.
あなたのActivityでは、このSensorListenerをimplementします.
public class ShakeActivity extends Activity implements SensorListener
SensorManagerを取得する必要があります
sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
次に、このセンサーが取得する必要があるデータのflagsを登録します.
ensorMgr.registerListener(this,SensorManager.SENSOR_ACCELEROMETER,SensorManager.SENSOR_DELAY_GAME);
あなたのonSensorChange()メソッドでは、shakeの動作を決定するためにこの粗い式があります.
public void onSensorChanged(int sensor, float[] values) {
if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
long curTime = System.currentTimeMillis();
// 100
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) {
Log.d(”sensor”, “shake detected w/ speed: ” + speed);
Toast.makeText(this, “shake detected w/ speed: ” + speed, Toast.LENGTH_SHORT).show();
}
last_x = x;
last_y = y;
last_z = z;
}
}
}
このshakeの速度臨界点値は、次のように定義されます.
private static final int SHAKE_THRESHOLD = 800;
この実現は実は簡単だ.私の次の投稿では、比較的繊細な検出方法を紹介し、iPhone開発で学んだ心得でもあります.
本帖例のソースコードは添付ファイルにあります.