美文网首页Android开发app开发
Android实现沉浸式状态栏

Android实现沉浸式状态栏

作者: cooperise | 来源:发表于2016-08-14 17:37 被阅读1460次
这里写图片描述

其实这也不算是真正意义上的沉浸式,主要是将状态栏与标题栏的颜色进行同步,是当今安卓app的一个热门形式(源于iOS应用),网上也有介绍很多方法,这里我主要介绍一种我常用的、认为较为快捷的方式,也是官方给出的方式:(备注:这是安卓4.4(api 19)以上才具有属性哦;该属性是借助SystemBarTintManager 实现的,SystemBarTintManager 类百度搜索即可)

public class MatchActionBarActivity extends Activity {  
    @Override 
    protected void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_match_actionbar);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
            setTranslucentStatus(true); 
       } 
       SystemBarTintManager tintManager = new SystemBarTintManager(this); 
       tintManager.setStatusBarTintEnabled(true); 
       tintManager.setStatusBarTintResource(R.color.statusbar_bg);  //通知栏所需颜色 
    } 
    
    @TargetApi(19) 
    private void setTranslucentStatus(boolean on) { 
        Window win = getWindow(); 
        WindowManager.LayoutParams winParams = win.getAttributes();
        final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
        if (on) { 
           winParams.flags |= bits; 
        } else { 
           winParams.flags &= ~bits; 
        } 
        win.setAttributes(winParams); 
    }
}

运行效果图:


这里写图片描述

一般安卓手机状态栏是黑色背景加上白色字体,这种设定下当我们将状态栏的背景颜色改成白色以外的任何颜色,基本都可以适应,但也有特殊情况,但我们将状态栏背景颜色设置成白色时,部分手机并不能自适应地将状态栏文字颜色设置成黑色,导致状态栏文字与背景混在一起(比如MIUI),这里也提供了一些简便的方法:
a. 针对Flyme系统:

/* * 设置状态栏图标为深色和魅族特定的文字风格
 * 可以用来判断是否为Flyme用户
 * @param window 需要设置的窗口 
 * @param dark 是否把状态栏字体及图标颜色设置为深色
 * @return boolean 成功执行返回true
 * */
public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) { 
   boolean result = false; 
   if (window != null) {
       try { 
            WindowManager.LayoutParams lp = window.getAttributes(); 
            Field darkFlag = WindowManager.LayoutParams.class .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); 
            Field meizuFlags = WindowManager.LayoutParams.class .getDeclaredField("meizuFlags"); 
            darkFlag.setAccessible(true); 
            meizuFlags.setAccessible(true);
            int bit = darkFlag.getInt(null);
            int value = meizuFlags.getInt(lp); 
            if (dark) { 
                  value |= bit; 
            } else { 
                  value &= ~bit; 
            }
            meizuFlags.setInt(lp, value); window.setAttributes(lp);
            result = true; 
       } catch (Exception e) { 
       } 
   } 
   return result;
}

b. 针对MIUIV6以上系统:

/* * 设置状态栏字体图标为深色,需要MIUIV6以上 
 * @param window 需要设置的窗口
 * @param dark 是否把状态栏字体及图标颜色设置为深色 
 * @return boolean 成功执行返回true 
 * */
public static boolean MIUISetStatusBarLightMode(Window window, boolean dark) { 
   boolean result = false; 
   if (window != null) { 
       Class clazz = window.getClass(); 
       try { 
            int darkModeFlag = 0; 
            Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); 
            Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); 
            darkModeFlag = field.getInt(layoutParams); 
            Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); 
            if(dark){ 
              extraFlagField.invoke(window,darkModeFlag,darkModeFlag);  //状态栏透明且黑色字体 
            }else{ 
              extraFlagField.invoke(window, 0, darkModeFlag);   //清除黑色字体
            } 
            result=true; 
       }catch (Exception e){
       }
   } 
   return result;
}

c. 针对Android6.0系统:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
    activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); 
}

或者在style属性中加上

<item name="android:windowLightStatusBar">true</item>

相关文章

网友评论

    本文标题:Android实现沉浸式状态栏

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