美文网首页
Activity强制横竖屏和全屏的方法

Activity强制横竖屏和全屏的方法

作者: 晓风残月酒醒 | 来源:发表于2019-09-26 13:42 被阅读0次

    废话不多说,直接上代码,xml布局如下:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/tvText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#cccccc"
            android:padding="8dp"
            android:text="开始切换"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </android.support.constraint.ConstraintLayout>
    

    布局里面就一个TextView,其他的什么都没有,Activity里面的代码如下:

    
    import android.app.Activity;
    import android.content.pm.ActivityInfo;
    import android.content.res.Configuration;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
        private final String TAG = MainActivity.class.getSimpleName();
        private Activity context;
        private TextView tvText;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.context = MainActivity.this;
            setContentView(R.layout.activity_main);
            this.tvText = this.findViewById(R.id.tvText);
            tvText.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 如果当前是横屏
                    if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
                        // 强制竖屏
                        context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                        // 取消全屏操作
                        setFullscreen(context, false);
                    }
                    // 如果当前是竖屏
                    else if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
                        // 强制横屏
                        context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                        // 执行全屏操作
                        setFullscreen(context, true);
                    }
                }
            });
        }
    
        /**
         * 如果需要针对刘海屏执行特殊操作,比如横屏的时候将刘海部分执行黑屏,那么下面的代码可以实现操作(如果并不需要针对刘海屏执行操作,那么不需要配置)
         * @param newConfig
         */
        @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                // 横屏的时候隐藏刘海屏的刘海部分
                if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
                    WindowManager.LayoutParams lp = getWindow().getAttributes();
                    lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
                    getWindow().setAttributes(lp);
                }
                // 竖屏的时候展示刘海屏的刘海部分
                else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
                    WindowManager.LayoutParams lp = getWindow().getAttributes();
                    lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
                    getWindow().setAttributes(lp);
                }
            }
        }
    
        // 执行全屏和取消全屏的方法
        private static void setFullscreen(Activity context, boolean fullscreen) {
            Window window = context.getWindow();
            WindowManager.LayoutParams winParams = window.getAttributes();
            final int bits = WindowManager.LayoutParams.FLAG_FULLSCREEN;
            if (fullscreen) {
                winParams.flags |= bits;
            } else {
                winParams.flags &= ~bits;
            }
            window.setAttributes(winParams);
        }
    }
    

    其中,执行横竖屏操作的 setRequestedOrientation 方法来自于Activity,强制全屏和取消全屏的操作需要修改Window的相关参数,这个Activity在Manifest.xml中的配置如下:

    <!-- 开始沉浸式配置 (如果并不需要针对刘海屏执行操作,那么不需要配置)-->
    <!-- 解决沉浸式全面屏上下部分留黑或留白问题或者使用此方法:android:resizeableActivity="true"targetSdkVersion>25或者android:maxAspectRatio="2.4" -->
    <meta-data
        android:name="android.max_aspect"
        android:value="2.4" />
    <!-- 适配华为(huawei)刘海屏 -->
    <meta-data
        android:name="android.notch_support"
        android:value="true" />
    <!-- 适配小米(xiaomi)刘海屏 -->
    <meta-data
        android:name="notch.config"
        android:value="portrait|landscape" />
    <!-- 结束沉浸式配置 -->
    
    <activity
        android:name=".MainActivity"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
    
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    

    相关文章

      网友评论

          本文标题:Activity强制横竖屏和全屏的方法

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