对于相机应用,我希望避免在方向更改时重新绘制活动。
到目前为止,我一直在使用android:screenOrientation="landscape"
现在我希望图标根据方向变化进行旋转。
嗯,它应该非常简单: 首先删除上面的代码行。 然后在活动清单中设置:
android:configChanges="orientation|screenSize|keyboardHidden"
最后,您在活动中覆盖onConfigurationChanged:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
//Do something
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
//Do something
}
}
现在,AFAIK,它应该触发onConfigurationChanged 而不是重新启动活动(假设它将在onConfigurationChanged中处理)
实际上,当方向改变时,除了不需要的旋转之外,还会触发onConfigurationChanged,但。如何取消?我错过了什么?
设备:小米Mi2s API:4.1.1
谢谢, 标记
答案 0 :(得分:1)
您需要阻止父级处理配置,如下所示:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(null);
//TODO: Do nothing when orientation has changed...
}
正如您所看到的,您需要做的就是将null传递给onConfigurationChanged的超级方法,因此它实际上会阻止您完成所有想要避免的更改。
问候!
答案 1 :(得分:0)
试试这个:
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
//Do something
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
//Do something
}
super.onConfigurationChanged(newConfig);
}
如果您不想重新创建活动,请使用方向传感器检测方向。
答案 2 :(得分:0)
好吧,在传统方法失败后 - 我决定自己实施方向改变例程。
为此,首先,我已将android:screenOrientation="landscape"
退回清单。
然后,我用一些数学实现了传感器监听器回调:
private SensorEventListener listener = new SensorEventListener() {
public void onSensorChanged(SensorEvent e) {
if (e.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
float x = e.values[0];
float y = e.values[1];
//update _angle in rotate()
if (Math.abs(y) / Math.abs(x) < 1.0)
{
if (x<0 && _angle != 270f)
rotate(270f);
else if(x>=0 && _angle != 90f)
rotate(90f);
}
else
{
if (y<0 && _angle != 180f)
rotate(180f);
else if (y>=0 && _angle != 0f)
rotate(0f);
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
};
像魅力一样。