摇一摇
来源:互联网 发布:盛杰影视网络课 编辑:程序博客网 时间:2024/05/29 17:30
以前做的一个小应用里面有摇一摇功能,有必要写下来做个笔记。
摇一摇功能主要用到加速度传感器:Sensor.TYPE_ACCELEROMETER
摇一摇功能主要是监听手机加速度变化,当超过设定的某一值时,即触发事件。
一、简单的一个示例
下给出一段简单的实现代码:
功能:原先textview1显示为“初始文本”, 当摇晃之后,textview1变为”摇一摇成功!!!“并伴随震动(点击按钮可回到”初始文本“)。
- public class SensorTestActivity extends Activity implements SensorEventListener
- {
- TextView tv = null;
- Button button = null;
- SensorManager sensorManager = null;
- Vibrator vibrator = null;
-
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- button = (Button) findViewById(R.id.button1);
- tv = (TextView) findViewById(R.id.textview1);
- button.setOnClickListener(new View.OnClickListener()
- {
-
- @Override
- public void onClick(View v)
- {
- tv.setText("初始文本");
- }
- });
-
- sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
- vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
-
- }
-
- @Override
- protected void onPause()
- {
- super.onPause();
- sensorManager.unregisterListener(this);
- }
-
- @Override
- protected void onResume()
- {
- super.onResume();
- sensorManager.registerListener(this,
- sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
- SensorManager.SENSOR_DELAY_NORMAL);
- }
-
- @Override
- public void onAccuracyChanged(Sensor sensor, int accuracy)
- {
-
- }
-
- @Override
- public void onSensorChanged(SensorEvent event)
- {
-
- int sensorType = event.sensor.getType();
-
- float[] values = event.values;
- if (sensorType == Sensor.TYPE_ACCELEROMETER)
- {
- if ((Math.abs(values[0]) > 17 || Math.abs(values[1]) > 17 || Math
- .abs(values[2]) > 17))
- {
- Log.d("sensor x ", "============ values[0] = " + values[0]);
- Log.d("sensor y ", "============ values[1] = " + values[1]);
- Log.d("sensor z ", "============ values[2] = " + values[2]);
- tv.setText("摇一摇成功!!!");
-
- vibrator.vibrate(500);
- }
-
- }
- }
-
- }
二、更加灵活一点的写法可以将监听部分与注册部分分开,这样的好处就是实现监听的代码复用。
以下贴几段以前的几段代码。
1. 监听部分
- public class ShakeListenerUtils implements SensorEventListener
- {
- private Activity context;
-
- public ShakeListenerUtils(Activity context)
- {
- super();
- this.context = context;
- }
-
- @Override
- public void onSensorChanged(SensorEvent event)
- {
- int sensorType = event.sensor.getType();
-
- float[] values = event.values;
-
- if (sensorType == Sensor.TYPE_ACCELEROMETER)
- {
-
-
-
-
- if ((Math.abs(values[0]) > 17 || Math.abs(values[1]) > 17 || Math
- .abs(values[2]) > 17))
- {
- context.overridePendingTransition(R.anim.zoom_out_enter,
- R.anim.zoom_out_exit);
-
- Intent intent = new Intent(context, OpenDoorActivity.class);
- context.startActivity(intent);
- context.finish();
- }
- }
- }
-
- @Override
- public void onAccuracyChanged(Sensor sensor, int accuracy)
- {
-
- }
-
- }
2. 注册部分
- public class ShakeILikeActivity extends Activity
- {
-
- private ShakeListenerUtils shakeUtils;
- private SensorManager mSensorManager;
-
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_shake_i_like);
-
- shakeUtils = new ShakeListenerUtils(this);
- }
-
- @Override
- protected void onResume()
- {
- super.onResume();
-
-
- mSensorManager = (SensorManager) this
- .getSystemService(Service.SENSOR_SERVICE);
-
- mSensorManager.registerListener(shakeUtils,
- mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
-
-
- SensorManager.SENSOR_DELAY_NORMAL);
- }
-
- @Override
- protected void onPause()
- {
- mSensorManager.unregisterListener(shakeUtils);
- this.overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
- super.onPause();
- }
-
- }
1 0