美文网首页
Activity全屏和非全屏动态切换

Activity全屏和非全屏动态切换

作者: HoooChan | 来源:发表于2018-04-08 10:53 被阅读110次

    效果图

    竖屏 横屏

    关键代码

        private static void enterFullScreen(Activity activity) {
            int flags = View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                flags |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE // 保持View Layout不变,隐藏状态栏或者导航栏后,View不会拉伸。
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN // 让View全屏显示,Layout会被拉伸到StatusBar下面,不包含NavigationBar。
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION // 让View全屏显示,Layout会被拉伸到StatusBar和NavigationBar下面。
                        | View.SYSTEM_UI_FLAG_FULLSCREEN // Activity全屏显示,且状态栏被隐藏覆盖掉。等同于(WindowManager.LayoutParams.FLAG_FULLSCREEN)。
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; // 隐藏虚拟按键(导航栏)。有些手机会用虚拟按键来代替物理按键。
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    // 这个flag只有当设置了SYSTEM_UI_FLAG_HIDE_NAVIGATION才起作用。如果没有设置这个flag,
                    // 任意的View相互动作都退出SYSTEM_UI_FLAG_HIDE_NAVIGATION模式。如果设置就不会退出。
                    flags |= View.SYSTEM_UI_FLAG_IMMERSIVE
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
                }
            }
    
            View decorView = activity.getWindow().getDecorView();
            if (decorView != null) {
                decorView.setSystemUiVisibility(flags);
            }
        }
    
        private static void exitFullScreen(Activity activity) {
            int flags = View.SYSTEM_UI_FLAG_VISIBLE;
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                flags |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE // 保持View Layout不变,隐藏状态栏或者导航栏后,View不会拉伸。
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN // 让View全屏显示,Layout会被拉伸到StatusBar下面,不包含NavigationBar。
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;// 让View全屏显示,Layout会被拉伸到StatusBar和NavigationBar下面
            }
    
            View decorView = activity.getWindow().getDecorView();
            if (decorView != null) {
                decorView.setSystemUiVisibility(flags);
            }
        }
    

    源码

    package com.huawei.fullscreen;
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.content.res.Configuration;
    import android.os.Build;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.FrameLayout;
    
    public class MainActivity extends AppCompatActivity {
    
        private boolean isFullScreen = false;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            final FrameLayout flControlContainer = findViewById(R.id.fl_control_container);
            final Button btnFullScreen = findViewById(R.id.btn_full_screen);
            btnFullScreen.setOnClickListener(new View.OnClickListener() {
                @SuppressLint("SetTextI18n")
                @Override
                public void onClick(View v) {
                    if (isFullScreen) {
                        flControlContainer.animate().alpha(1);
                        exitFullScreen(MainActivity.this);
                        btnFullScreen.setText("Enter Fullscreen");
                        isFullScreen = false;
                    } else {
                        flControlContainer.animate().alpha(0);
                        enterFullScreen(MainActivity.this);
                        btnFullScreen.setText("Exit Fullscreen");
                        isFullScreen = true;
                    }
                }
            });
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            initUiFlags();
        }
    
        @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            initUiFlags();
        }
    
        private void initUiFlags() {
            exitFullScreen(this);
        }
    
        private static void enterFullScreen(Activity activity) {
            int flags = View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                flags |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE // 保持View Layout不变,隐藏状态栏或者导航栏后,View不会拉伸。
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN // 让View全屏显示,Layout会被拉伸到StatusBar下面,不包含NavigationBar。
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION // 让View全屏显示,Layout会被拉伸到StatusBar和NavigationBar下面。
                        | View.SYSTEM_UI_FLAG_FULLSCREEN // Activity全屏显示,且状态栏被隐藏覆盖掉。等同于(WindowManager.LayoutParams.FLAG_FULLSCREEN)。
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; // 隐藏虚拟按键(导航栏)。有些手机会用虚拟按键来代替物理按键。
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    // 这个flag只有当设置了SYSTEM_UI_FLAG_HIDE_NAVIGATION才起作用。如果没有设置这个flag,
                    // 任意的View相互动作都退出SYSTEM_UI_FLAG_HIDE_NAVIGATION模式。如果设置就不会退出。
                    flags |= View.SYSTEM_UI_FLAG_IMMERSIVE
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
                }
            }
    
            View decorView = activity.getWindow().getDecorView();
            if (decorView != null) {
                decorView.setSystemUiVisibility(flags);
            }
        }
    
        private static void exitFullScreen(Activity activity) {
            int flags = View.SYSTEM_UI_FLAG_VISIBLE;
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                flags |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE // 保持View Layout不变,隐藏状态栏或者导航栏后,View不会拉伸。
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN // 让View全屏显示,Layout会被拉伸到StatusBar下面,不包含NavigationBar。
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;// 让View全屏显示,Layout会被拉伸到StatusBar和NavigationBar下面
            }
    
            View decorView = activity.getWindow().getDecorView();
            if (decorView != null) {
                decorView.setSystemUiVisibility(flags);
            }
        }
    }
    

    布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <com.huawei.fullscreen.FitsSystemWindowFrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/bg_stroke_white"
        tools:context="com.huawei.fullscreen.MainActivity">
    
        <FrameLayout
            android:id="@+id/fl_control_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="top"
                android:layout_marginLeft="15dp"
                android:layout_marginRight="15dp"
                android:background="@drawable/bg_stroke_white"
                android:gravity="center"
                android:padding="15dp"
                android:text="Top"
                android:textColor="@android:color/white"
                android:textSize="16sp"
                tools:ignore="HardcodedText"/>
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"
                android:layout_marginLeft="15dp"
                android:layout_marginRight="15dp"
                android:background="@drawable/bg_stroke_white"
                android:gravity="center"
                android:padding="15dp"
                android:text="Bottom"
                android:textColor="@android:color/white"
                android:textSize="16sp"
                tools:ignore="HardcodedText"/>
        </FrameLayout>
    
        <Button
            android:id="@+id/btn_full_screen"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="Enter Fullscreen"
            tools:ignore="HardcodedText"/>
    </com.huawei.fullscreen.FitsSystemWindowFrameLayout>
    

    FitsSystemWindowFrameLayout可以确保布局内的控件在全屏切换时不被状态栏遮挡。

    相关文章

      网友评论

          本文标题:Activity全屏和非全屏动态切换

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