android 扫描二维码 状态栏不透明,沉浸式状态栏和透明状态栏

前言

一般手机的界面上都会有:状态栏、标题栏、导航栏等固定的布局;

28ddbc55d598

样式图

区别

沉浸式状态栏:这种样式其实就是把状态栏、标题栏、导航栏都去掉,让整个屏幕都只显示应用要显示的界面,从而给用户一种“沉浸”在里面的感觉!

28ddbc55d598

效果图1

28ddbc55d598

效果图2

透明状态栏:这种样式其实就是把状态栏和标题栏配置成一种颜色,达到一种美观效果!

28ddbc55d598

效果图

透明状态栏

4.4版本一下没办法配置透明栏,4.4、5.0、6.0不同版本又会有不同的效果,所以我们要做好适配工作

实现步骤

去掉系统自带的标题栏,采用自定义的状态栏(自定义状态栏推荐使用Toolbar)

设置状态栏为透明

第一种方法:

@Override

protected void onCreate(Bundle savedInstanceState) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

}

super.onCreate(savedInstanceState);

}

第二种方法:

使用android:windowTranslucentStatus属性需要在res目录下新建values-v19文件夹,style文件要放在里面。

true

防止状态栏和自定义标题栏重合

第一种方法:

在Activity的根布局文件中添加

android:fitsSystemWindows="true"

```

第二种方法:

给在Toolbar的上方添加一个和状态栏高度一样的Veiw,并将这个View的背景色设置成和Toolbar的背景色一样。也可以直接给Toobar设置paddingTop等于状态栏高。

public static void setToolBarPaddingHeight(Window window, View view) {

//TODO: 代码设置标题栏paddingtop为状态栏的高

int statusBarHeight = getStatusBarHeight(window.getContext());

view.setPadding(view.getPaddingLeft(), view.getPaddingTop() + statusBarHeight, view.getPaddingRight(), view.getPaddingBottom());

}

public static int getStatusBarHeight(Context context) {

//TODO: 算取状态栏的高

int result = 0;

int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");

if (resourceId > 0) {

result = context.getResources().getDimensionPixelSize(resourceId);

}

return result;

}

通过以上就可以实现透明状态栏了。总的来说还是比较简单的,下面贴一下只用代码就可以实现透明状态栏的工具类!

/**

* Created by ML on 2017/3/9.

* 前言:

* 在Android4.4之前,我们的应用没法改变手机的状态栏颜色,google在Android4.4以后提供了设置状态栏的方法;

* 沉浸式状态栏和透明式状态栏是不同的概念;

*/

public class UIUtils {

//TODO: 透明状态栏相关方法

/**

* 相关Flag

WindowManager.LayoutParams.FLAG_FULLSCREEN

隐藏状态栏

View.SYSTEM_UI_FLAG_VISIBLE API 14

默认标记

View.SYSTEM_UI_FLAG_LOW_PROFILE API 14

低调模式, 会隐藏不重要的状态栏图标

View.SYSTEM_UI_FLAG_LAYOUT_STABLE API 16

保持整个View稳定, 常和控制System UI悬浮, 隐藏的Flags共用, 使View不会因为System UI的变化而重新layout

View.SYSTEM_UI_FLAG_FULLSCREEN API 16

状态栏隐藏,效果同设置WindowManager.LayoutParams.FLAG_FULLSCREEN

View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN API 16

视图延伸至状态栏区域,状态栏上浮于视图之上

View.SYSTEM_UI_FLAG_HIDE_NAVIGATION API 14

隐藏导航栏

View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION API 16

视图延伸至导航栏区域,导航栏上浮于视图之上

View.SYSTEM_UI_FLAG_IMMERSIVE API 19

沉浸模式, 隐藏状态栏和导航栏, 并且在第一次会弹泡提醒, 并且在状态栏区域滑动可以呼出状态栏(这样会系统会清楚之前设置的View.SYSTEM_UI_FLAG_FULLSCREEN或View.SYSTEM_UI_FLAG_HIDE_NAVIGATION标志)。使之生效,需要和View.SYSTEM_UI_FLAG_FULLSCREEN,View.SYSTEM_UI_FLAG_HIDE_NAVIGATION中的一个或两个同时设置。

View.SYSTEM_UI_FLAG_IMMERSIVE_STIKY API 19

与上面唯一的区别是, 呼出隐藏的状态栏后不会清除之前设置的View.SYSTEM_UI_FLAG_FULLSCREEN或View.SYSTEM_UI_FLAG_HIDE_NAVIGATION标志,在一段时间后将再次隐藏系统栏)

*/

/**

* 实现透明状态栏且不需要配置android:fitsSystemWindows="true"

* 注意::标题栏根布局高度必须是自适应

*

* @param window

* @param view 标题栏根布局(根布局高度必须是自适应)

*/

public static void setScreenTranslucentStatus(Window window, int Color, View view) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

setTranslucentStatusForSDK_LOLLIPOP(window, Color);

} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

setTranslucentStatusForSDK_KITKAT(window);

}

setToolBarPaddingHeight(window, view);

}

/**

* 实现透明状态栏需要配置android:fitsSystemWindows="true"

* 注意::标题栏根布局高度必须是自适应

*

* @param window

*/

public static void setTranslucentStatusXML(Window window, int color) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

setTranslucentStatusForSDK_LOLLIPOP(window, color);

} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

setTranslucentStatusForSDK_KITKAT(window);

}

}

/**

* 设置Android状态栏的字体颜色,状态栏为亮色的时候字体和图标是黑色,状态栏为暗色的时候字体和图标为白色

*

* @param dark 状态栏字体和图标是否为深色

*/

public static void setStatusBarFontDark(@NonNull Window window, @NonNull boolean dark, int color, View view) {

//TODO: 实现状态栏白底黑字

if (PhoneUtil.isMIUI()) {

setMIUIBarFontDark(window, dark, view);

} else if (PhoneUtil.isFlyme()) {

setFlymeBarFontDark(window, dark, view);

} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

setSDK_MBarFontDark(window, dark, view);

} else {

L.i("Android原生6.0一下系统>>>>>>>>>>>>>>>实现状态栏灰底白字");

setToolBarBgColor(window, color, view);

}

}

public static void setSDK_MBarFontDark(@NonNull Window window, @NonNull boolean dark, View view) {

//TODO: 配置Android原生6.0系统状态栏白底黑字

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

if (dark) {

setScreenTranslucentStatus(window, Color.TRANSPARENT, view);

window.getDecorView().setSystemUiVisibility(

View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

L.i("Android原生6.0系统>>>>>>>>>>>>>>>状态栏白底黑字");

}

}

}

public static void setFlymeBarFontDark(@NonNull Window window, @NonNull boolean dark, View view) {

//TODO: 配置魅族系统状态栏白底黑字

try {

setScreenTranslucentStatus(window, Color.TRANSPARENT, view);

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);

L.i("小米系统>>>>>>>>>>>>>>>状态栏白底黑字");

} catch (Exception e) {

e.printStackTrace();

}

}

public static void setMIUIBarFontDark(@NonNull Window window, @NonNull boolean dark, View view) {

//TODO: 配置小米系统状态栏白底黑字

try {

setScreenTranslucentStatus(window, Color.TRANSPARENT, view);

Class clazz = window.getClass();

Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");

Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");

int 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);

}

L.i("小米系统>>>>>>>>>>>>>>>状态栏白底黑字");

} catch (Exception e) {

e.printStackTrace();

}

}

public static void setToolBarBgColor(Window window, int color, View view) {

//TODO: Android原生5.0一下系统实现灰底白字

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

setTranslucentStatusForSDK_LOLLIPOP(window, color);

setToolBarPaddingHeight(window, view);

} else {

// setTranslucentStatusForSDK_KITKAT(window);

L.i("Android原生4.4以上5.0一下系统需要自己手动在状态栏加view实现灰底白字(http://www.jianshu.com/p/a44c119d6ef7)");

}

}

public static void setToolBarPaddingHeight(Window window, View view) {

//TODO: 代码设置标题栏paddingtop为状态栏的高

int statusBarHeight = getStatusBarHeight(window.getContext());

view.setPadding(view.getPaddingLeft(), view.getPaddingTop() + statusBarHeight, view.getPaddingRight(), view.getPaddingBottom());

}

public static void setTranslucentStatusForSDK_KITKAT(Window window) {

//TODO: 4.4以上系统状态栏透明

window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

}

public static void setTranslucentStatusForSDK_LOLLIPOP(Window window, int Color) {

//TODO: 5.0以上系统状态栏透明

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

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); //TODO: 指定状态栏的颜色和布局的颜色相同

}

}

public static int getStatusBarHeight(Context context) {

//TODO: 算取状态栏的高

int result = 0;

int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");

if (resourceId > 0) {

result = context.getResources().getDimensionPixelSize(resourceId);

}

return result;

}

```

#### 沉浸式状态栏

重写Activity的onWindowFocusChanged()方法,然后加入如下逻辑即可:

@Override

public void onWindowFocusChanged(boolean hasFocus) {

super.onWindowFocusChanged(hasFocus);

if (hasFocus && Build.VERSION.SDK_INT >= 19) {

View decorView = getWindow().getDecorView();

decorView.setSystemUiVisibility(

View.SYSTEM_UI_FLAG_LAYOUT_STABLE

| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION

| View.SYSTEM_UI_FLAG_FULLSCREEN

| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

}

}

[参考文章1](http://blog.csdn.net/xuchao_blog/article/details/54693482)

[参考文章2](http://www.jianshu.com/p/a44c119d6ef7)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值