沉浸式

作者: 放肆滴微笑 | 来源:发表于2019-12-03 17:18 被阅读0次
  • 通过主题设置状态栏
4.4-5.0版本
<!-- 状态栏透明设置 必须是4.4以上的版本-->
<item name="android:windowTranslucentStatus">true</item>
<!-- 虚拟按键透明设置 -->
<item name="android:windowTranslucentNavigation">true</item>
5.0以上版本
<!-- 状态栏透明设置 必须是4.4以上的版本 -->
<item name="android:windowTranslucentStatus">false</item>
<!-- 虚拟按键透明设置 -->
<item name="android:windowTranslucentNavigation">true</item>
<!-- 5.0以上设置状态栏的颜色  但是必须是windowTranslucentStatus为false  -->
<item name="android:statusBarColor">@android:color/transparent</item>
  • 通过代码设置
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            //获取到状态栏设置的两条属性
            int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
            int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
            //在4.4之后又有两种情况  第一种 4.4-5.0   第二种 5.0以上
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
                //第二种 5.0以上
                Window window   = getWindow();
                WindowManager.LayoutParams attributes = window.getAttributes();
                attributes.flags |= flagTranslucentNavigation;
                window.setAttributes(attributes);
                window.setStatusBarColor(0);
            }else{
                //第一种 4.4-5.0
                Window window   = getWindow();
                WindowManager.LayoutParams attributes = window.getAttributes();
                attributes.flags |= flagTranslucentStatus|flagTranslucentNavigation;
                window.setAttributes(attributes);
            }
        }

上述代码实现了沉浸式,但是控件会跑到状态栏上,解决方法
1、 在布局文件中设置一个View,来填充状态栏

# 这个是布局中设置的View,填充的View
<View
    android:id="@+id/statusBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>


# 代码中解决方法
{
    //获取到view控件
    View statusBar = findViewById(R.id.statusBar);
    //获取到它的Params对象
    ViewGroup.LayoutParams layoutParams = statusBar.getLayoutParams();
    //设置它的高度
    layoutParams.height = getStatusHeight();
    //设置layoutParams
    statusBar.setLayoutParams(layoutParams);
    //设置背景颜色
    statusBar.setBackgroundColor(Color.RED);
}

/**
 * 获取状态栏的高度
 * @return
 */
public int getStatusHeight(){
    //获取到状态栏的资源ID
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    //如果获取到了
    if(resourceId>0){
        //就返回它的高度
        return getResources().getDimensionPixelSize(resourceId);
    }
    //否则返回0
    return 0;
}

2、 设置布局的paddingBottom值

{
    //获取到根布局的view
    View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
    //给根布局设置padding值
    rootView.setPadding(0, getStatusHeight(), 0, getNavigationBarHeight());
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        //第二种 5.0以上
        getWindow().setStatusBarColor(Color.RED);
    } else {
        //第一种 4.4-5.0
        //获取到根布局
        ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
        View statusBar = new View(this);
        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusHeight());
        statusBar.setBackgroundColor(Color.RED);
        statusBar.setLayoutParams(layoutParams);
        decorView.addView(statusBar);
    }
}

/**
 * 获取状态栏的高度
 * @return
 */
public int getStatusHeight(){
    //获取到状态栏的资源ID
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    //如果获取到了
    if(resourceId>0){
        //就返回它的高度
        return getResources().getDimensionPixelSize(resourceId);
    }
    //否则返回0
    return 0;
}

/**
 * 获取到底部虚拟按键的高度
 * @return
 */
public int getNavigationBarHeight(){
    //获取到虚拟按键的资源ID
    int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
    //如果获取到了
    if(resourceId>0){
        //就返回它的高度
        return getResources().getDimensionPixelSize(resourceId);
    }
    return 0;
}

3、 xml根布局添加 android:fitsSystemWindows="true" 可能出问题

侧滑菜单问题----------->
1.5.0菜单有阴影:解决办法给NavigationView 加入app:insetForeground="#00000000"
2.4.4 可以给最外层布局设置fitSystemWidows为true且设置clipToPadding为false

public void addFlags(int flags){

setFlags(flags, flags);

}


public void clearFlags(int flags){

setFlags(0, flags);

}


public void setFlags(int flags, int mask){

final WindowManager.LayoutParams attrs = getAttributes();

attrs.flags = (attrs.flag & ~mask) | (flags & masks);

.........

}


attrs的flags变量转化成二进制,每位是1或者0来控制某一个属性。

以下假设将各个int型变量转换为二进制:

假设原来flags的变量原来为11111111,

flags为1 

mask为11,那么意味着原来的最低两位,将会被mask清零。变成11111100.

同时flags为1,与11111100做 | 操作,原来的flags现在的值就是11111101.

相关文章

  • 沉浸式学习

    怎么样才能沉浸式学习,为什么我只能沉浸式玩手机? 他们沉浸式回家,沉浸式学习,沉浸式生活,总之,都能够沉浸进去。而...

  • 适配Android刘海屏小结

    by hzwusibo 20180907 一、沉浸式与非沉浸式来回切换页面适配 二、沉浸式页面适配 (非沉浸式...

  • Android 沉浸式模式与常见状态栏和导航栏效果

    Android沉浸式模式 官方称沉浸式状态栏为沉浸式模式。 什么是沉浸式?沉浸式就是让人专注当前的(由设计者营造)...

  • 沉浸式阅读 沉浸式生活

    10.13陪女儿上课,突然感受到那种沉浸式快乐,完全投入,女儿配合,我也很开心。下午还发现一个青年作家,喜欢这种有...

  • 被打乱了的生活节奏

    沉浸式追剧,沉浸式护肤,沉浸式逛街,沉浸式购物,沉浸式工作……这些,都远我而去了 本学年第一次月考,请假,因为哺乳...

  • “沉浸式”体验

    最近注意到一个新词儿“沉浸式”,偶尔刷视频,总是能看到各种沉浸式标题的视频,“沉浸式看房”,“沉浸式做饭”,“沉浸...

  • 沉浸式

    http://www.cnblogs.com/android-blogs/p/5690725.htmlhttp:/...

  • 沉浸式

    我对沉浸式的理解就是状态栏和导航栏变为透明把背景图片和标题栏显示出来比如 通过theme实现方式 通过代码设置 图...

  • 沉浸式

    通过主题设置状态栏 通过代码设置 上述代码实现了沉浸式,但是控件会跑到状态栏上,解决方法1、 在布局文件中设置一...

  • 沉浸式

    最近几年社会提倡更多的是阅读,都腹中有书气质华,读书可以改变生活,改变气质,不管是央视的诗词大塞,还是个个公众号a...

网友评论

      本文标题:沉浸式

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