写在前面
Android中各个传感器的应用都是一个模子.后面请看具体实现情况.
- 拿到
SensorManager
(传感器管理器). - 获取相应传感器
getDefaultSensor()
. - 监听传感器感应到的变化
registerListener()
.
光线传感器
- 代码
public class LightActivity extends Activity {
@Bind(R.id.tv) TextView tv;
private SensorManager sm;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_light);
ButterKnife.bind(this);
}
@OnClick(R.id.bt_openLight) public void openLight() {
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); // 传感器管理器
Sensor sensor = sm.getDefaultSensor(Sensor.TYPE_LIGHT); // 光线传感器
sm.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL); // 注册监听
}
@Override protected void onDestroy() {
super.onDestroy();
if (sm != null) {
sm.unregisterListener(sel);
}
sel = null; // 手动销毁实例
sm = null; // 手动销毁实例
}
private SensorEventListener sel = new SensorEventListener() {
@Override public void onSensorChanged(SensorEvent event) {
float value = event.values[0]; // 监听感应变化的值
tv.setText("当前亮度:" + value + "lx");
}
@Override public void onAccuracyChanged(Sensor sensor, int accuracy) { }
};
}
- 效果图:值会随光线强度动态变化.
加速度传感器
是不是想到了微信摇一摇,加速度超过某个值就会咔咔,叮铃铃.
- 代码
public class ShakeActivity extends Activity {
@Bind(R.id.tv_accX) TextView tvAccX;
@Bind(R.id.tv_accY) TextView tvAccY;
@Bind(R.id.tv_accZ) TextView tvAccZ;
private SensorManager sm;
private Vibrator vibrator; // 震动
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shake);
ButterKnife.bind(this);
}
@OnClick(R.id.bt_shake) public void shake() {
vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); // 传感器管理器
Sensor sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); // 加速度传感器
sm.registerListener(sel, sensor, SensorManager.SENSOR_DELAY_NORMAL); // 注册监听
}
@Override protected void onDestroy() {
super.onDestroy();
if (sm != null) {
sm.unregisterListener(sel);
}
sel = null;
sm = null;
}
private SensorEventListener sel = new SensorEventListener() {
@Override public void onSensorChanged(SensorEvent event) {
// 加速度可以为负值,在此取绝对值
final float xacc = Math.abs(event.values[0]);
final float yacc = Math.abs(event.values[1]);
final float zacc = Math.abs(event.values[2]);
runOnUiThread(new Runnable() {
@Override public void run() {
tvAccX.setText(xacc + ":::X轴加速度");
tvAccY.setText(yacc + ":::Y轴加速度");
tvAccZ.setText(zacc + ":::Z轴加速度");
}
});
if (xacc > 19 || yacc > 19 || zacc > 19) {
Toast.makeText(MyApplication.getCtx(), "摇一摇了哦", Toast.LENGTH_SHORT).show();
// arg0:停-震;arg1:-1表不重复,非-1表从parent指定下标开始重复
vibrator.vibrate(new long[] {500, 200, 500, 200, 500, 200}, -1);
}
}
@Override public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
}
- 说明
- 本例加入了Vibrator振动器,关于Vibrator的使用可参照本例,具体震动节奏后文会推出插补器(说白了就是简单数学公式)详细说明.
- 效果图