Android ApiDemos 学习 Graphics->SensorTest
2013-12-12 21:21
387 查看
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判断设备移动方向的代码如下:
[java] view
plaincopyprint?
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的例子,加上:
[java] view
plaincopyprint?
mValues = values;
if (mView != null) {
mView.invalidate();
相关文章推荐
- Android ApiDemos示例解析(79):Graphics->SensorTest
- Android ApiDemos示例解析(52):Graphics->AnimateDrawables
- Android ApiDemos示例解析(55):Graphics->BitmapMesh
- Android ApiDemos示例解析(202):Graphics->OpenGL ES->Cube Map
- Android ApiDemos示例解析(77):Graphics->RoundRects
- Android ApiDemos示例解析(83):Graphics->Typefaces
- Android ApiDemos示例解析:Graphics->Layers
- Android ApiDemos示例解析(71):Graphics->Patterns
- Android ApiDemos示例解析(84):Graphics->UnicodeChart
- Android ApiDemos示例解析(75):Graphics->PurgeableBitmap
- Android ApiDemos示例解析(61):Graphics->Compass
- Android ApiDemos示例解析(80):Graphics->Sweep
- Android ApiDemos示例解析(72):Graphics->Pictures
- Android ApiDemos示例解析(200):Graphics->OpenGL ES->Textured Triangle
- Android ApiDemos示例解析(76):Graphics->Regions
- Android ApiDemos示例解析(205):Graphics->OpenGL ES->Translucent GLSurfaceView
- Android ApiDemos示例解析:Graphics->Layers
- Android ApiDemos示例解析(77):Graphics->RoundRects
- Android ApiDemos示例解析(85):Graphics->Vertices
- Android ApiDemos示例解析(54):Graphics->BitmapDecode