手机移动程序开发

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

2019-12-06  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读