(AS笔记)Android全透明沉浸式主题样式——代码篇

目录

  • 1.前言
  • 2.Android当前SDK版本号 > API 19-Android 4.4
  • 3.Android当前SDK版本号 > API 21-Android 5.0
  • 4.扩展知识点
  • 5.完整沉浸式主题代码
  • 6.总结


1.前言

        上一章,介绍了Theme主题设置方式,实现沉浸式主题。那本文就记录代码实现沉浸式主题效果。

        Theme设置沉浸式,传送门链接:

        (AS笔记)Android全透明沉浸式主题样式——顶部状态栏+底部导航栏

          CSDN链接:https://blog.csdn.net/qq_39038178/article/details/119657376

        沉浸式工具类,传送门链接:

        (AS笔记)Android全透明沉浸式主题样式——工具类篇

          CSDN链接:https://blog.csdn.net/qq_39038178/article/details/119847976


2.Android当前SDK版本号 > API 19-Android 4.4

        (1)设置顶部状态栏半透明

Window window = getWindow(); //获取window对象
//若没有指定属性,顶部状态栏默认浅灰色
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

        (2)设置底部状导航栏半透明

Window window = getWindow(); //获取window对象
//若没有指定属性,底部导航栏默认黑色
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

        (3)Android版本判断,同时设置(1)(2)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    Window window = getWindow(); //获取window对象
    //设置顶部状态栏半透明
    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    //设置底部状导航栏半透明
    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}

(AS笔记)Android全透明沉浸式主题样式——代码篇_第1张图片


3.Android当前SDK版本号 > API 21-Android 5.0

        (1)全屏显示+状态栏自动隐藏:手势下滑,显示出来——下滑=失效,应用主体内容不占用系统状态栏空间

Window window = getWindow();
//隐藏顶部状态栏,下滑一次失效
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); 

        (2)全屏显示+状态栏固定显示:不监听手势——应用主体内容占用系统状态栏空间

Window window = getWindow();
//全屏显示+状态栏固定
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
//固定布局,搭配View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,属实绝配
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

        (3)隐藏顶部状态栏:全屏显示+状态栏固定后,此时顶部状态栏被占用,并且没有指定属性,因此会默认浅灰色

Window window = getWindow();
//顶部状态栏透明——Android 5.0+ 的属性
window.setStatusBarColor(Color.TRANSPARENT);

说明:已经实现沉浸式=顶部状态栏被应用主体内容占用+实现状态栏透明,效果如下:

(AS笔记)Android全透明沉浸式主题样式——代码篇_第2张图片

        (4)设置状态栏字体颜色,只支持Android 6.0及以上版本

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}

(AS笔记)Android全透明沉浸式主题样式——代码篇_第3张图片

        (5)隐藏底部导航栏+不固定:监听手势——触屏=失效

Window window = getWindow();
//隐藏底部导航栏,触屏失效
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

(AS笔记)Android全透明沉浸式主题样式——代码篇_第4张图片

        (6)自动隐藏底部导航栏+固定:监听手势——上滑弹出=不失效

Window window = getWindow();
//隐藏底部导航栏,触屏失效
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
//强制固定布局,实现沉浸式
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);


4.扩展知识点

        (1)禁用返回键

    /**
     * 屏蔽物理返回按钮
     * @param keyCode
     * @param event
     * @return
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_BACK){
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

        (2)顶部状态栏主题

//Android 6.0 及以上版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().getDecorView().setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR // 内容黑色主题
    |View.SYSTEM_UI_FLAG_LAYOUT_STABLE); // 内容主题跟随系统
}

        (3)顶部状态栏设置颜色

Window window = getWindow();
//开启状态栏着色
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//设置状态栏颜色
window.setStatusBarColor(getResources().getColor(R.color.colorAccent));

        (4)设置不能横屏

//设置不能横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//设置不能横屏

5.完整沉浸式主题代码

    /**
     * 设置全屏显示:顶部状态栏透明+底部导航栏透明
     *
     * @param activity
     */
    private void fullScreen(Activity activity) {
        /**
         * Android当前SDK版本号 > API 19-Android 4.4
         */
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window window = getWindow(); //获取window对象
            //设置顶部状态栏半透明
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //设置底部状导航栏半透明
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
        /**
         * Android当前SDK版本号 > API 21-Android 5.0
         */
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS//设置顶部状态栏半透明
                    | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//设置底部状导航栏半透明
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    |View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    |View.SYSTEM_UI_FLAG_HIDE_NAVIGATION //隐藏底部导航栏
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setNavigationBarColor(Color.TRANSPARENT);//底部导航栏透明——API 21 后开饭的属性
            //顶部状态栏透明——Android 5.0+ 的属性
            window.setStatusBarColor(Color.TRANSPARENT);
        }
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//            getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
//        }
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//设置不能横屏
    }

6.总结

仅自己学习记录,如有错误,敬请谅解~,谢谢~~~ 

你可能感兴趣的:(AS笔记,android,沉浸式,kitkat,LOLLIPOP)