private final SensorEventListener mListener = new SensorEventListener() {
private final float[] mScale = new float[] { 2, 2.5f, 0.5f }; // accel
private float[] mPrev = new float[3];
private long mLastGestureTime;
public void onSensorChanged(SensorEvent event) {
boolean show = false;
float[] diff = new float[3];
for (int i = 0; i < 3; i++) {
diff[i] = Math.round(mScale[i] * (event.values[i] - mPrev[i]) * 0.45f);
if (Math.abs(diff[i]) > 0) {
show = true;
}
mPrev[i] = event.values[i];
}
if (show) {
// only shows if we think the delta is big enough, in an attempt
// to detect "serious" moves left/right or up/down
Log.e(TAG, "sensorChanged " + event.sensor.getName() +
" (" + event.values[0] + ", " + event.values[1] + ", " +
event.values[2] + ")" + " diff(" + diff[0] +
" " + diff[1] + " " + diff[2] + ")");
}
long now = android.os.SystemClock.uptimeMillis();
if (now - mLastGestureTime > 1000) {
mLastGestureTime = 0;
float x = diff[0];
float y = diff[1];
boolean gestX = Math.abs(x) > 3;
boolean gestY = Math.abs(y) > 3;
if ((gestX || gestY) && !(gestX && gestY)) {
if (gestX) {
if (x < 0) { //好吧 检查设备的移动方向..
Log.e("test", "<<<<<<<< LEFT <<<<<<<<<<<<");
} else {
Log.e("test", ">>>>>>>>> RITE >>>>>>>>>>>");
}
} else {
if (y < -2) {
Log.e("test", "<<<<<<<< UP <<<<<<<<<<<<");
} else {
Log.e("test", ">>>>>>>>> DOWN >>>>>>>>>>>");
}
}
mLastGestureTime = now;
}
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mView = new SampleView(this);
setContentView(mView);
if (Config.DEBUG) Log.d(TAG, "create " + mSensorManager);
}
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(mListener, mSensor, SensorManager.SENSOR_DELAY_FASTEST);//注册的时机
if (Config.DEBUG) Log.d(TAG, "resume " + mSensorManager);
}
@Override
protected void onStop() {
mSensorManager.unregisterListener(mListener);//释放的时机!!
super.onStop();
if (Config.DEBUG) Log.d(TAG, "stop " + mSensorManager);
}
private class SampleView extends View {
private Paint mPaint = new Paint();
private Path mPath = new Path();
private boolean mAnimate;
public SampleView(Context context) {
super(context);
// Construct a wedge-shaped path
mPath.moveTo(0, -50);
mPath.lineTo(-20, 60);
mPath.lineTo(0, 50);
mPath.lineTo(20, 60);
mPath.close();
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = mPaint;
canvas.drawColor(Color.WHITE);
paint.setAntiAlias(true);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);
int w = canvas.getWidth();
int h = canvas.getHeight();
int cx = w / 2;
int cy = h / 2;
canvas.translate(cx, cy);
if (mValues != null) {
canvas.rotate(-mValues[0]);
}
canvas.drawPath(mPath, mPaint);
}
@Override
protected void onAttachedToWindow() {
mAnimate = true;
if (Config.DEBUG) Log.d(TAG, "onAttachedToWindow. mAnimate="+mAnimate);
super.onAttachedToWindow();
}
@Override
protected void onDetachedFromWindow() {
mAnimate = false;
if (Config.DEBUG) Log.d(TAG, "onAttachedToWindow. mAnimate="+mAnimate);
super.onDetachedFromWindow();
}
}
}
sf
本例SensorTest和例子Android ApiDemos示例解析(61):Graphics->Compass在绘图方面的介绍基本一样,我也不知道为什么Google 再把这个SensorTest还是归在Graphics 目录下。
本例着重点是介绍使用SensorManager.SENSOR_ACCELEROMETER 如何来判断设备的移动方向:使用Log的方式而非图形的方式显示结果,所以运行本例显示的箭头始终向上。
本例归在Hardware比较合理。如何使用SENSOR_ACCELEROMETER判断设备移动方向的代码如下:
- public void onSensorChanged(int sensor, float[] values) {
- boolean show = false;
- float[] diff = new float[3];
- for (int i = 0; i < 3; i++) {
- diff[i] = Math.round(mScale[i]
- * (values[i] - mPrev[i]) * 0.45f);
- if (Math.abs(diff[i]) > 0) {
- show = true;
- }
- mPrev[i] = values[i];
- }
- ...
- long now = android.os.SystemClock.uptimeMillis();
- if (now - mLastGestureTime > 1000) {
- mLastGestureTime = 0;
- float x = diff[0];
- float y = diff[1];
- boolean gestX = Math.abs(x) > 3;
- boolean gestY = Math.abs(y) > 3;
- if ((gestX || gestY) && !(gestX && gestY)) {
- if (gestX) {
- if (x < 0) {
- android.util.Log.e("test",
- "<<<<<<<< LEFT <<<<<<<<<<<<");
- } else {
- android.util.Log.e("test",
- ">>>>>>>>> RITE >>>>>>>>>>>");
- }
- } else {
- if (y < -2) {
- android.util.Log.e("test",
- "<<<<<<<< UP <<<<<<<<<<<<");
- } else {
- android.util.Log.e("test",
- ">>>>>>>>> DOWN >>>>>>>>>>>");
- }
- }
- mLastGestureTime = now;
- }
- }
- }
如果想在设备移动时,屏幕上箭头的指向随着变化,可以参见Compass的例子,加上:
- mValues = values;
- if (mView != null) {
- mView.invalidate();