我需要检测Android设备方向更改,而无需手动使用传感器数据,同时保持活动方向坚持某种方向
onConfigurationChange
无效,因为我的活动会不会轮换。
利用传感器数据来检测方向变化我认为这是一个轮子的发明,因为android已经有嵌入式算法实现来检测设备方向的变化。从另一方面来看,方向变化的检测不是这样的简单检查。
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER || event.values.length < 3) {
return;
}
//getResources().getConfiguration().orientation;
if (event.values[1] < 6.5 && event.values[1] > -6.5) {
if (orientation!=1) {
Log.d("Sensor", "Protrait");
}
orientation=1;
} else {
if (orientation!=0) {
Log.d("Sensor", "Landscape");
}
orientation=0;
}
}
确实需要真正的数据处理,例如噪音过滤和突然的短暂摇动/旋转。
那么有什么想法如何使用传统服务检测设备方向? (再一次,我会将我的活动强调到某个方向,因此onConfigurationChange
将不起作用)
答案 0 :(得分:9)
有一个倾向于事件的听众。
SO question mentioning implementation of that Listener.
Code Example for the same here in this blog
我希望这会对你有所帮助
答案 1 :(得分:7)
通过在Manifest中设置screenOrientation
属性,您将无法再从onConfigurationChanged
获取方向值,因为它会停止触发,因此可以实现{{1}获取SensorEventListener
,Pitch
和roll
角度来计算方向,但它有点复杂,并且对于这样的任务来说太过分了。我找到的最佳解决方案是使用yaw
,以下代码将更新方向更改时的旋转值,根据旋转角度值为0到4:
OrientationEventListener
答案 2 :(得分:5)
我的活动设置为始终处于纵向模式。将此代码放在“创建”上。
myOrientationEventListener = new OrientationEventListener(this,SensorManager.SENSOR_DELAY_NORMAL) {
public void onOrientationChanged(int arg0) {
if (arg0>=315 || arg0<45){
currentOrientation = Surface.ROTATION_90;
}else if (arg0>=45 && arg0<135){
currentOrientation = Surface.ROTATION_180;
}else if (arg0>=135 && arg0<225){
currentOrientation = Surface.ROTATION_270;
}else if (arg0>=225 && arg0<315){
currentOrientation = Surface.ROTATION_0;
}
}
};