/**
* Created by ricky.peng on 2018/5/25.
* @author ricky.peng
* 沉浸式狀態(tài)欄工具類
*/
public class TStatusBarHelper {
//是否需要沉浸式狀態(tài)欄
private static boolean isNeedTransStatus=true;
//沉浸式狀態(tài)欄公荧,比較復(fù)雜的沉浸式建議用這個
// 4.4上沒有狀態(tài)欄著色,如果狀態(tài)欄變淺色容易導(dǎo)致看不清狀態(tài)欄字體残邀,
// 5.0有著色的時候,避免淺色狀態(tài)欄看不清字體設(shè)置半透明狀態(tài)欄
// 6.0 SYSTEM_UI_FLAG_LIGHT_STATUS_BAR可以讓系統(tǒng)自適應(yīng)狀態(tài)欄字體和背景色
public static void translucentStatus(Activity activity) {
if (activity == null||!isNeedTransStatus) {
return;
}
Window window = activity.getWindow();
if (window != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//取消狀態(tài)欄透明
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//添加Flag把狀態(tài)欄設(shè)為可繪制模式
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//設(shè)置狀態(tài)欄顏色,API 21開始可以使用洲脂,低于6.0的時候掏湾,很多頁面都是淺色的,導(dǎo)致狀態(tài)欄不清晰飞盆,所以5.0設(shè)置半透明
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.setStatusBarColor(Color.parseColor("#33000000"));
}
//設(shè)置系統(tǒng)狀態(tài)欄處于可見狀態(tài)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}
}
}
}
//沉浸式狀態(tài)欄娄琉,如果UI設(shè)計比較簡單,建議使用這個
public static void translucentEasyStatus(Activity activity) {
if (activity == null||!isNeedTransStatus) {
return;
}
Window window = activity.getWindow();
if (window != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//取消狀態(tài)欄透明
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//添加Flag把狀態(tài)欄設(shè)為可繪制模式
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//設(shè)置狀態(tài)欄顏色,API 21開始可以使用吓歇,低于6.0的時候孽水,很多頁面都是淺色的,導(dǎo)致狀態(tài)欄不清晰城看,所以5.0設(shè)置半透明
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.setStatusBarColor(Color.TRANSPARENT);
}
//設(shè)置系統(tǒng)狀態(tài)欄處于可見狀態(tài)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}
}
}
}
//沉浸式狀態(tài)欄女气,微信的做法,通過UI設(shè)計同意toolbar和狀態(tài)欄顏色析命,減少適配的問題
public static void translucentStatus(Activity activity,int color) {
if (activity == null||!isNeedTransStatus) {
return;
}
Window window = activity.getWindow();
if (window != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//取消狀態(tài)欄透明
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//添加Flag把狀態(tài)欄設(shè)為可繪制模式
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//設(shè)置狀態(tài)欄顏色
window.setStatusBarColor(ContextCompat.getColor(activity, color));
//設(shè)置系統(tǒng)狀態(tài)欄處于可見狀態(tài)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}
}
}
}
//fragment的沉浸式適配主卫,要讓fragment的背景延伸到狀態(tài)欄
// 不使用activity的背景色的時候,fitSystemWindows=false,然后再fragment中設(shè)置這個,否則直接設(shè)置fitSystemWindows=true會采用activity的背景色
public static void setStatusBarHeight(View view){
if (view!=null&&isNeedTransStatus) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
view.setPadding(0, getstatubarheight(view.getContext()), 0, 0);
}
}
}
//獲取狀態(tài)欄高度
private static int getstatubarheight(Context context) {
int height = 0;
int resourceid = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceid > 0) {
height = context.getResources().getDimensionPixelOffset(resourceid);
}
return height;
}
}
想要做到包括圖片在內(nèi)的沉浸, 必須理解好fitsSystemWindows屬性, 以利用padding效果, 將內(nèi)容上移或者下移
當(dāng)然鹃愤,還有xml的方法可以設(shè)置簇搅,百度谷歌都有很多,還有設(shè)置沉浸以后在頂部設(shè)置一個透明view的方法软吐。
大家具體可以根據(jù)項目需求瘩将,選擇最簡單的實現(xiàn)。