3.动态方向锁定

作者: Jennyni1122 | 来源:发表于2018-09-27 08:38 被阅读10次

3.1 问题

在某些特定的条件下,不能让屏幕旋转,但这个条件是临时的或是根据用户的意愿决定的。

3.2 解决方案

(API Level 1)
借助Android的请求方向机制(requested orientation mechanism),应用程序可以调整显示Activity的屏幕方向,将其固定为某个方向或是交由设备决定。这是通过调用Activity.SetReActivity的屏幕方向。这通常是根据设备的物理方向来确定的。当前请求的方向可以随时通过调用Activity.getRequestedOrientation()方法获得。

3.3 实现机制

举个示例,让我们创建一个ToggleButton实例来控制是否锁定当前屏幕方向,这样就能让用户随时控制Activity的方向。以下代码描绘了在其中定义ToggleButton实例的简单布局。
res/layout/activity_lock.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ToggleButton
        android:id="@+id/toggleButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textOff="Lock"
        android:textOn="LOCKED" />
</FrameLayout>

在Activity代码中,我们给这个按钮的状态创建一个监听器,根据按钮的值决定锁定或解锁屏幕的方向(参见以下代码)。
动态锁定/解锁屏幕方向的Activity

public class LockActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lock);

        //获得按钮资源的句柄
        ToggleButton toggle = (ToggleButton)findViewById(R.id.toggleButton);
        //在添加监听器之前设置默认状态
        if( getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED ) {
            toggle.setChecked(true);
        } else {
            toggle.setChecked(false);
        }
        //将监听器关联到按钮
        toggle.setOnCheckedChangeListener(new OrientationLockListener());
    }

    private class OrientationLockListener implements CompoundButton.OnCheckedChangeListener {

        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            int current = getResources().getConfiguration().orientation;
            if(isChecked) {
                switch(current) {
                case Configuration.ORIENTATION_LANDSCAPE:
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                    break;
                case Configuration.ORIENTATION_PORTRAIT:
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                    break;
                default:
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
                }
            } else {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
            }
        }
    };
}

监听器中的这段代码是本攻略的关键。如果用户按下这个按钮,将其置为ON状态,应用程序就通过保存Resources.getConfiguration()的orientation参数读取当前的屏幕方向。Configuration对象 用来表示屏幕方向的常数与所请求的方向使用的常数不同,所以我们根据当前的屏幕方向进行切换,然后再用合适的常熟调用setRequestedOrientation()方法。

注意:
如果所请求的方向跟当前状态不一样,且Activity在前台,Activity就会立即切换方向以满足请求。

如果用户按下了这个按钮,将其设为OFF状态,我们就不再锁定方向,因此用SCREEN_ORIENTATION_UNSPECIFIED常数再调用一次setRequestedOrientation(),将控制权交还给设备。如果设备当前的物理方向跟移除锁定时的Activity方向不一致,也会导致屏幕切换方向。

注意:
设置请求的方向不会保持默认的Activity生命周期。如果设备配置发生变化(例如物理键盘弹出,或是设备方向改变),Activity依然会被销毁并重新创建,因此所有保持Activity状态的规则都适用。

相关文章

  • 3.动态方向锁定

    3.1 问题 在某些特定的条件下,不能让屏幕旋转,但这个条件是临时的或是根据用户的意愿决定的。 3.2 解决方案 ...

  • 锁定方向

    方向是一个人行动的指南针。有方向的人是在为美好的结果而努力,没目标的人只会在原地折腾。 有所成就的人最明显的特征就...

  • 锁定方向

    突然在某个失眠的夜晚, 我重新锁定了人生的方向。 也许生命会因此而綻放出力量。 是的, 就这样, 我去他的一切不愉...

  • 图配诗‖就是这个方向

    妈妈,是从这个方向飞走的 也应该从这个方向回来 我用自信的眼睛把时间锁定 呼喊时掉落的羽毛一同把方向锁定 翅膀还不...

  • Revit二次开发:关于三维视图(View3D)

    关于Revit三维锁定视图 Revit锁定视图3个选项及对应API:1. 保存方向并锁定视图: 将视图锁定在当前方...

  • 最会学习第五天

    第五天 1.目标确定——目标像灯塔,指引我们前进方向; 2.责任锁定——责任像枷锁,逼着我们靠近目标; 3.节点检...

  • Android 屏幕锁定为portrait或者landscape

    Android 屏幕锁定为portrait或者landscape时手机旋转方向的获取 屏幕锁定时不会触发onCon...

  • 找准方向,锁定目标

    新时代下,我们要用新的思维去解决所面临的问题。站在十字路口,心中方向是我们前行的指南针。高德地图成了我们出行...

  • 2.锁定Activity方向

    2.1 问题 应用程序中的某个Activity不能旋转,或是旋转需要应用程序代码更直接的干预。 2.2 解决方案 ...

  • 移动端手势识别-常见的几种应用的原理

    1.旋转 2.缩放 3.方向锁定 4.下拉刷新 旋转原理:如图, 旋转角度为黄线与垂直线的夹角-绿线与垂直线的夹...

网友评论

    本文标题:3.动态方向锁定

    本文链接:https://www.haomeiwen.com/subject/krkgwftx.html