您的位置:首页 > 移动开发 > Android开发

Android开发---摇一摇功能

2015-01-06 00:28 148 查看
以前做的一个小应用里面有摇一摇功能,有必要写下来做个笔记。

摇一摇功能主要用到加速度传感器Sensor.TYPE_ACCELEROMETER

摇一摇功能主要是监听手机加速度变化,当超过设定的某一值时,即触发事件。

一、简单的一个示例

下给出一段简单的实现代码:

功能:原先textview1显示为“初始文本”, 当摇晃之后,textview1变为”摇一摇成功!!!“并伴随震动(点击按钮可回到”初始文本“)。

[java] view
plaincopy

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. 监听部分

[java] view
plaincopy

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. 注册部分

[java] view
plaincopy

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: