美文网首页手机移动程序开发
安卓沉浸式状态栏 — 工具类

安卓沉浸式状态栏 — 工具类

作者: 华人有为 | 来源:发表于2019-12-06 22:29 被阅读0次

    Google 在 Android 4.4 的 API 描述页面里提到了“Translucent system UI styling”,即半透明化的系统UI风格。这个“半透明化”包括了状态栏和通知栏,当开发者让应用支持这个新特性的时候,状态栏和导航栏可以单独/同时变为渐变的半透明样式。

    image.png

    “沉浸式状态栏”准确来说应该是“透明栏”,英文名“Translucent Bars”,是Android 4.4 新定义的设计规范。简单来说就是在软件打开的时候通知栏和软件顶部颜色融为一体,这样可以使软件和系统本身更加融为一体,同时通知栏的颜色不再是白色、黑色简单的两种了。

    工具类实现沉浸式状态栏的原理


    image image.png

    上代码:工具类的代码

    package 你的包名;
    
    import android.app.Activity;
    import android.graphics.Color;
    import android.os.Build;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Toast;
    
    import 你的包名.R;
    
    /**
     * Created by 公众号IT波 on 2019/5/19. Copyright © Leon. All rights reserved.
     * Functions: 用来处理 (例如)HomeFragmnet 沉浸式导航栏的问题
     */
    public class StBarUtil {
    
      
        //不用在style的xml文件中设置透明了这个方法会直接抹去状态栏
        public final static void setOccupationHeight(Activity activity,View itemView){
    
            //想要设置沉浸式状态栏的activity中都创建一个view 高度为状态栏高度 设置成自己想要的颜色
            View view;
            if (itemView != null){
                view = itemView.findViewById(R.id.Occupation);
            }else{
                view = activity.findViewById(R.id.Occupation);
            }
    
    
            if(Build.VERSION.SDK_INT >= 21){
    
                //想要设置沉浸式状态栏的activity中都创建一个view 高度20dp 设置成自己想要的颜色
                if (view != null){//避免空指针异常
                    //动态的设置view的高度==状态栏的高度
                    view.setVisibility(View.VISIBLE);
                    ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) view.getLayoutParams();
                    params.height = getStatusBarHeight(activity);
                    view.setLayoutParams(params);
                }
                View decorView = activity.getWindow().getDecorView();
                decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
                activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
            }else {
                //低版本不适配沉浸式状态栏所以要隐藏
                if (view != null){
                    view.setVisibility(View.GONE);
                }
            }
        }
    
    
        /**
         * 获得状态栏的高度
         */
        private static int getStatusBarHeight(Activity activity) {
            int result = 0;
            int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
            if (resourceId > 0) {
                result = activity.getResources().getDimensionPixelSize(resourceId);
            }
            return result;
        }
    }
    
    

    在activity中使用:

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_goods_info);
          
            //设置沉浸式状态栏
            StBarUtil.setOccupationHeight(this, null);
        }
    

    在Fragment中使用:

     //注意在onCreateView  也可以的  下面的方法是我继承自定义的父类 本质上还是onCreateView
        
        @Override
        public View initView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
            
            View view = View.inflate(mContext, R.layout.fragment_home, null);
            
            //设置沉浸式状态栏
             StBarUtil.setOccupationHeight(getActivity(), view);​
    ​
            return view;
        }
    

    注意布局文件中一定要有顶替statusbar的那个view (id:Occupation 必须和工具类中一致)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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:id="@+id/activity_goods_info"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".app.GoodsInfoActivity">
    
        <!--状态栏高度占位view  颜色随心所欲设置 id一定要和工具类里一致-->
        <View
            android:id="@+id/Occupation"
            android:layout_width="match_parent"
            android:layout_height="0dp"/>
           
    </LinearLayout>
    

    demo

    安卓学习公众号:

    安卓学习公众号.jpg

    相关文章

      网友评论

        本文标题:安卓沉浸式状态栏 — 工具类

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