沉浸式

作者: 放肆滴微笑 | 来源:发表于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.
    

    相关文章

      网友评论

          本文标题:沉浸式

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