冻结屏幕方向



有带有以下代码的复选框:

    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);
            }
        }
    });

因此,当我检查它时,屏幕将旋转到默认的系统方向(我的平板电脑的横向)。

我需要冻结当前方向。如果将设备设置为纵向并切换了复选框,则必须启用设备旋转,直到取消选中复选框。

Display.getRotation() 不是解决方案,因为每个设备都有自己的 Surface.ROTATE。

所以,这是我的解决方案。

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 台平板电脑)上,它可以正常工作。

创建一个成员变量并保存当前设置的状态。空头is_landscape = -1;

选中更改侦听器 您可以永久设置状态并保存它。

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);
}

如果您不想保存和还原实例,则可以使用。

android:configChanges="orientation"

在您的Menifest文件中,它不允许在更改设备方向时重新创建活动。

希望它能为你工作。

如果你想检测反向状态,你也可以使用

int state = (WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getRotate();

如果状态Surface.ROTATION_0则它将是纵向的如果状态Surface.ROTATION_90那么它将是横向的如果状态Surface.ROTATION_180则为反向纵向如果状态Surface.ROTATION_270则它将是反向横向

设置肖像以防Surface.ROTATION_0和Surface.ROTATION_180。设置景观以防Surface.ROTATION_90和Surface.ROTATION_270。

您还可以设置旋转而不是方向,以便设备处于旋转状态而不是定向状态。

既然你知道如何获取当前方向,那就写

if(isChecked){
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}

相关内容

  • 没有找到相关文章

最新更新