前言
這種效果從android4.4開始引進的,并且在5.0進行了改進。因此,也只能將這一特性應用在android4.4以上的手機,無法做到全部適配。網上已經有很多有關于系統狀態欄的解決方案,自己在網上項目中提煉出來的解決方案. 大牛可以忽略本文(*^ω^*)?先上個效果圖
實現AppBarLayout.OnOffsetChangedListener 監聽
@Override
public voidonOffsetChanged(AppBarLayoutappBarLayout,intoffset) {
if(offset==0) {
if(state!=CollapsingToolbarLayoutState.EXPANDED) {
state=CollapsingToolbarLayoutState.EXPANDED;//修改狀態標記為展開SystemUtils.StatusBarDarkMode((Activity)getContext(),type);
}
}else if(Math.abs(offset)>=appBarLayout.getTotalScrollRange()) {
if(state!=CollapsingToolbarLayoutState.COLLAPSED) {
state=CollapsingToolbarLayoutState.COLLAPSED;//修改狀態標記為折疊
type=SystemUtils.StatusBarLightMode((Activity)getContext());
}
}else{
if(state!=CollapsingToolbarLayoutState.INTERNEDIATE) {
if(state==CollapsingToolbarLayoutState.COLLAPSED){
state=CollapsingToolbarLayoutState.INTERNEDIATE;//修改狀態標記為中間
type=SystemUtils.StatusBarLightMode((Activity)getContext());
}
}
/**
*修改狀態欄為全透明
*@paramactivity
*/
@TargetApi(19)
public static voidtransparencyBar(Activityactivity) {
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {
Windowwindow=activity.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
|WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
}else{
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT) {
Windowwindow=activity.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
}
staticSystemBarTintManagertintManager;
/**
*修改狀態欄顏色,支持4.4以上版本
*@paramactivity
*@paramcolorId
*/
public static voidsetStatusBarColor(Activityactivity,intcolorId,booleaniskkclose) {
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {
Windowwindow=activity.getWindow();
window.setStatusBarColor(activity.getResources().getColor(colorId));
}else if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT) {
if(tintManager==null) {
tintManager= newSystemBarTintManager(activity);
}
if(iskkclose) {
tintManager.setStatusBarTintEnabled(true);
}else{
tintManager.setStatusBarTintEnabled(false);
}
tintManager.setStatusBarTintResource(colorId);
}
}
/**
*設置狀態欄黑色字體圖標,
*適配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android
*@paramactivity
* ?//白色可以替換成其他淺色系
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static intStatusBarLightMode(Activityactivity) {
intresult=0;
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT) {
if(MIUISetStatusBarLightMode(activity.getWindow(),true)) {//MIUI
result=1;
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {//5.0
}else if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT) {//4.4
activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}else if(FlymeSetStatusBarLightMode(activity.getWindow(),true)) {//Flyme
result=2;
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {//5.0
activity.getWindow().setStatusBarColor(ContextCompat.getColor(activity,R.color.transparent));
}else if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT) {//4.4
activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}else if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {//6.0
result=3;
activity.getWindow().setStatusBarColor(ContextCompat.getColor(activity,R.color.transparent));
activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}else{
result=4;
setStatusBarColor(activity,R.color.color_gray_999999,true);
}
}
returnresult;
}
/**
*清除MIUI或flyme或6.0以上版本狀態欄黑色字體
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static voidStatusBarDarkMode(Activityactivity,inttype){
if(type==1){
MIUISetStatusBarLightMode(activity.getWindow(),false);
}else if(type==2){
FlymeSetStatusBarLightMode(activity.getWindow(),false);
}else if(type==3){
activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
Windowwindow=activity.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
}else if(type==4){
setStatusBarColor(activity,R.color.transparent,false);
}
}
/**
*設置狀態欄字體圖標為深色,需要MIUIV6以上
*
*@paramwindow需要設置的窗口
*@paramdark是否把狀態欄字體及圖標顏色設置為深色
*@returnboolean成功執行返回true
*/
public static booleanMIUISetStatusBarLightMode(Windowwindow,booleandark) {
booleanresult= false;
if(window!= null) {
Classclazz=window.getClass();
try{
intdarkModeFlag=0;
ClasslayoutParams=Class.forName("android.view.MiuiWindowManager$LayoutParams");
Fieldfield=layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
darkModeFlag=field.getInt(layoutParams);
MethodextraFlagField=clazz.getMethod("setExtraFlags",int.class,int.class);
if(dark) {
extraFlagField.invoke(window,darkModeFlag,darkModeFlag);//狀態欄透明且黑色字體
}else{
extraFlagField.invoke(window,0,darkModeFlag);//清除黑色字體
}
result= true;
}catch(Exceptione) {
}
}
returnresult;
}
/**
*設置狀態欄圖標為深色和魅族特定的文字風格
*可以用來判斷是否為Flyme用戶
*
*@paramwindow需要設置的窗口
*@paramdark是否把狀態欄字體及圖標顏色設置為深色
*@returnboolean成功執行返回true
*/
public static booleanFlymeSetStatusBarLightMode(Windowwindow,booleandark) {
booleanresult= false;
if(window!= null) {
try{
WindowManager.LayoutParamslp=window.getAttributes();
FielddarkFlag=WindowManager.LayoutParams.class
.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
FieldmeizuFlags=WindowManager.LayoutParams.class
.getDeclaredField("meizuFlags");
darkFlag.setAccessible(true);
meizuFlags.setAccessible(true);
intbit=darkFlag.getInt(null);
intvalue=meizuFlags.getInt(lp);
if(dark) {
value|=bit;
}else{
value&= ~bit;
}
meizuFlags.setInt(lp,value);
window.setAttributes(lp);
result= true;
}catch(Exceptione) {
}
}
returnresult;
}