Shake Events in android?
deepak - Wed Mar 28 2012 23:36:30 GMT-0400 (EDT)
SENSOR is the key word here
SENSOR is the key word here
deepak - Wed Mar 28 2012 23:37:06 GMT-0400 (EDT)
SensorEventListener API reference
deepak - Wed Mar 28 2012 23:40:20 GMT-0400 (EDT)
SensorEventListener
When sensor values changes, Sensor manager
calls the sensor event listener for notifications.
Two methods needs to be implemented as part of this Interface
public abstract void onAccuracyChanged (Sensor sensor, int accuracy);
public abstract void onSensorChanged (SensorEvent event);
deepak - Wed Mar 28 2012 23:43:48 GMT-0400 (EDT)
Here is the sample program Step 1
Use the below class as the Implementation for the sensor event listener interface
package com.ai.app.game.unscramble.expert.listener;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
/**
* Listener that detects shake gesture.
*/
public class ShakeEventListener implements SensorEventListener {
/** Minimum movement force to consider. */
private static final int MIN_FORCE = 10;
/**
* Minimum times in a shake gesture that the
direction of movement needs to
* change.
*/
private static final int MIN_DIRECTION_CHANGE = 3;
/** Maximum pause between movements. */
private static final int MAX_PAUSE_BETHWEEN_DIRECTION_CHANGE = 200;
/** Maximum allowed time for shake gesture. */
private static final int MAX_TOTAL_DURATION_OF_SHAKE = 400;
/** Time when the gesture started. */
private long mFirstDirectionChangeTime = 0;
/** Time when the last movement started. */
private long mLastDirectionChangeTime;
/** How many movements are considered so far. */
private int mDirectionChangeCount = 0;
/** The last x position. */
private float lastX = 0;
/** The last y position. */
private float lastY = 0;
/** The last z position. */
private float lastZ = 0;
/** OnShakeListener that is called
when shake is detected. */
private OnShakeListener mShakeListener;
/**
* Interface for shake gesture.
*/
public interface OnShakeListener {
/**
* Called when shake gesture is detected.
*/
void onShake();
}
public void
setOnShakeListener(OnShakeListener listener) {
mShakeListener = listener;
}
@Override
public void onSensorChanged(SensorEvent se) {
// get sensor data
float x = se.values[SensorManager.DATA_X];
float y = se.values[SensorManager.DATA_Y];
float z = se.values[SensorManager.DATA_Z];
// calculate movement
float totalMovement =
Math.abs(x + y + z - lastX - lastY - lastZ);
if (totalMovement > MIN_FORCE) {
// get time
long now = System.currentTimeMillis();
// store first movement time
if (mFirstDirectionChangeTime == 0) {
mFirstDirectionChangeTime = now;
mLastDirectionChangeTime = now;
}
// check if the last movement was not long ago
long lastChangeWasAgo = now - mLastDirectionChangeTime;
if (lastChangeWasAgo
< MAX_PAUSE_BETHWEEN_DIRECTION_CHANGE) {
// store movement data
mLastDirectionChangeTime = now;
mDirectionChangeCount++;
// store last sensor data
lastX = x;
lastY = y;
lastZ = z;
// check how many movements are so far
if (mDirectionChangeCount >=
MIN_DIRECTION_CHANGE) {
// check total duration
long totalDuration = now - mFirstDirectionChangeTime;
if (totalDuration <
MAX_TOTAL_DURATION_OF_SHAKE) {
mShakeListener.onShake();
resetShakeParameters();
}
}
} else {
resetShakeParameters();
}
}
}
/**
* Resets the shake parameters to their default values.
*/
private void resetShakeParameters() {
mFirstDirectionChangeTime = 0;
mDirectionChangeCount = 0;
mLastDirectionChangeTime = 0;
lastX = 0;
lastY = 0;
lastZ = 0;
}
@Override
public void onAccuracyChanged(Sensor sensor, i
nt accuracy) {
}
}
deepak - Wed Mar 28 2012 23:44:57 GMT-0400 (EDT)
Step 2 : Create Global variable in your activity
/**
* SensorManager handle
*/
private SensorManager mSensorManager;
/**
* ShakeEventListener handle
*/
private ShakeEventListener mSensorListener;
deepak - Wed Mar 28 2012 23:47:14 GMT-0400 (EDT)
Step 3: Initialize it in the onCreate() of your activity
call the below method from the onCreate()
private void setUpShakeListener()
{
mSensorListener = new ShakeEventListener();
mSensorManager = (SensorManager)
getSystemService(Context.SENSOR_SERVICE);
mSensorManager.registerListener(mSensorListener,
mSensorManager.getDefaultSensor
(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
mSensorListener.setOnShakeListener(new
ShakeEventListener.OnShakeListener() {
public void onShake() {
scrambleWord();
}
});
}
deepak - Wed Mar 28 2012 23:48:56 GMT-0400 (EDT)
Step 4: Register and Unregister on onPause() and onResume()
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
cancel();
}
mSensorManager.unregisterListener(mSensorListener);
}
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(mSensorListener,
mSensorManager.
getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
}