冻结屏幕方向
有复选框与下面的代码:冻结屏幕方向
CheckBox cb = (CheckBox)findViewById(R.id.freezer);
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
}
}
});
所以,当我检查了,屏幕旋转到系统默认的方向(横向为我的平板电脑)。
我需要冻结CURRENT方向。如果您将设备转为纵向并切换CheckBox,则必须重新启动设备旋转,直到取消选中CheckBox。
Display.getRotation()是不是一个解决方案,因为每个设备都有它自己的Surface.ROTATION
所以,这是我的解决方案。
private int getCurentOrientation() {
Display d = ((WindowManager) getSystemService(WINDOW_SERVICE))
.getDefaultDisplay();
boolean isWide = d.getWidth() >= d.getHeight();
switch (d.getRotation()) {
case Surface.ROTATION_0:
return isWide ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
: ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
case Surface.ROTATION_90:
return isWide ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
: ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
case Surface.ROTATION_180:
return isWide ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
: ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
case Surface.ROTATION_270:
return isWide ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
: ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
return -1;
}
private void lockOrientation(boolean lock) {
if (lock) {
setRequestedOrientation(getCurentOrientation());
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
}
}
在4个设备(2个智能手机和2个平板电脑)上,它的工作原理如下。
既然你知道如何让当前的方向,只写
if(isChecked){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
创建memeber变量并保存当前的设置状态。 short is_landscape = -1;
oncheckedchange监听器,您可以永久设置您的状态并保存它。
if (is_landscape == -1) {
Configuration config_screen = getResources().getConfiguration();
int orientation = config_screen.orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
setRequestedOrientation(Configuration.ORIENTATION_LANDSCAPE);
is_landscape = 0;
} else {
setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT);
is_landscape = 1;
}
}
问题是,只要你旋转你的设备,它就会重新创建你的活动,这样你就失去了你的状态。所以只保存你的is_landscape变量
@Override
protected void onSaveInstanceState(Bundle outState) {
oustate.putExtra("last_state", is_landscape);
super.onSaveInstanceState(outState);
}
you can restore your position on on restore instance
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
is_landscape = savedInstanceState.getShort("last_state");
if (is_landscape == 0) {
setRequestedOrientation(Configuration.ORIENTATION_LANDSCAPE);
} else if (is_landscape == 1) {
setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT);
}
super.onRestoreInstanceState(savedInstanceState);
}
如果你不想保存和恢复实例,那么你可以使用。
机器人:configChanges =“方向”
在menifest文件时,它不会允许在改变你的设备的方向重新创建活动。
希望它能为你工作。
如果要检测相反的状态也可以使用
INT状态=(窗口管理器)getSystemService(WINDOW_SERVICE))getDefaultDisplay()getRotation()。
如果状态是Surface.ROTATION_0那么这将是肖像 如果状态是Surface.ROTATION_90那么这将是景观 如果状态是Surface.ROTATION_180那么这将是相反的肖像 如果状态是Surface.ROTATION_270那么它将成为反转景观
在Surface.ROTATION_0和Surface.ROTATION_180的情况下设置纵向。 在Surface.ROTATION_90和Surface.ROTATION_270的情况下设置横向。
您还可以设置旋转而不是方向,以便您的设备将处于旋转状态而不是定向状态。
您的代码在REVERSE_LANDSCAPE和REVERSE_PORTRAIT方向上会失败 – styanton 2012-04-25 06:01:56
如果它在横向和纵向上工作,那么您可以使其工作我已经给出了您的想法,只需要检测reverse_landscape和reverse_portrai模式并保存其状态并将其恢复即可 – 2012-04-25 06:38:32
我已经给出你想你现在可以保存你的逆向状态,并恢复它onrestoreinstance剩下的事情是你只需要检测reverse_landscape和reverse_portrait并保存它。 – 2012-04-25 06:44:35
你知道如何正确定位吗? – styanton 2012-04-25 06:00:33
'Display display =((WindowManager)getSystemService(WINDOW_SERVICE))。getDefaultDisplay(); int orientation = display。getOrientation();'// portrait = 1;景观= 2; – Pallavi 2012-04-25 06:29:10
@styanton接受正确的答案/哪些适合你。 – Pallavi 2012-04-25 06:48:15