安卓沉浸式状态栏 — 工具类
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>
安卓学习公众号:
安卓学习公众号.jpg