功能实现:通过指南针传感器获得转动角度,设置指南针图片的转动动画即可
- 获取系统 SensorManager 来进行传感器设置(变量已声明)
private Sensor sensor;
private SensorManager sensorManager;
private ImageView ivCompass;//指南针图片
private float fromDegrees = 0f, toDegrees;//图片转动时开始、结束角度
@Override
protected void onResume() {
super.onResume();
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
//通过 getDefaultSensor 获得指南针传感器
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
//为传感器管理者注册监听器,第三个参数指获取速度正常
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
为了提高app运行效率,将此段代码放在 onResume() 方法中,只在要呈现界面的时候执行
2.让 Activity 实现 SensorEventListener ,并复写 onSensorChanged 和 onAccuracyChanged 方法,我们只需在 onSensorChanged 方法中完善逻辑
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
switch (sensorEvent.sensor.getType()){
case Sensor.TYPE_ORIENTATION:
//顺时针转动为正,故手机顺时针转动时,图片得逆时针转动
toDegrees = -sensorEvent.values[0];
//让图片相对自身中心点转动,开始角度默认为0;此后开始角度等于上一次结束角度
RotateAnimation ra = new RotateAnimation(fromDegrees, toDegrees, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
//动画时间200毫秒
ra.setDuration(200);
ra.setFillAfter(true);
ivCompass.startAnimation(ra);
fromDegrees = toDegrees;
break;
}
}
setFillAfter参数为true:每次动画结束,就停留在结束时的样子
为false:每次动画结束,就回到动画开始时的样子
3.为了使App退出当前界面时停止使用传感器,在 onPause() 方法中加入
@Override
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
}
参数为this,即为注销所有监听器,其他参数可以选择某一个监听器
所有这些做完之后,如果 App 还不能运行,那就说明
扔了你的破机子吧。连指南针传感器都木有!!!