Android开发---摇一摇功能

以前做的一个小应用里面有摇一摇功能,有必要写下来做个笔记。

摇一摇功能主要用到加速度传感器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)
	{
		//当传感器精度改变时回调该方法,Do nothing.
	}

	@Override
	public void onSensorChanged(SensorEvent event)
	{

		int sensorType = event.sensor.getType();
		//values[0]:X轴,values[1]:Y轴,values[2]:Z轴
		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();
		//values[0]:X轴,values[1]:Y轴,values[2]:Z轴  
		float[] values = event.values;

		if (sensorType == Sensor.TYPE_ACCELEROMETER)
		{

			/*正常情况下,任意轴数值最大就在9.8~10之间,只有在突然摇动手机 
			  的时候,瞬时加速度才会突然增大或减少。   监听任一轴的加速度大于17即可
			*/
			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);
				//检测到晃动后启动OpenDoor效果
				Intent intent = new Intent(context, OpenDoorActivity.class);
				context.startActivity(intent);
				context.finish();
			}
		}
	}

	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy)
	{
		//当传感器精度改变时回调该方法,Do nothing. 
	}

}

2. 注册部分

public class ShakeILikeActivity extends Activity
{

	private ShakeListenerUtils shakeUtils;
	private SensorManager mSensorManager; //定义sensor管理器, 注册监听器用

	@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),
				//还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,  
				//根据不同应用,需要的反应速率不同,具体根据实际情况设定  
				SensorManager.SENSOR_DELAY_NORMAL);
	}

	@Override
	protected void onPause()
	{
		mSensorManager.unregisterListener(shakeUtils);
		this.overridePendingTransition(R.anim.fade_in, R.anim.fade_out);//回退时闪一下
		super.onPause();
	}

}

转载请注明出处:http://blog.csdn.net/xn4545945  



你可能感兴趣的:(Android,Android开发点点滴滴)