沉浸式状态栏 设置状态栏颜色

方式一:使用系统API

这个特性是andorid4.4支持的,最少要api19才可以使用。

1、隐藏标题栏等

在代码中设置

requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题栏

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//窗口透明的状态栏

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//窗口透明的导航栏

setContentView(R.layout.activity_main);

或者在整个应用的样式中设置

<resources>

<style name="AppBaseTheme" parent="android:Theme.Light"></style>

<style name="AppTheme" parent="AppBaseTheme">

<!-- 隐藏标题栏 -->

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

<!-- 窗口透明的状态栏 -->

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

<!-- 窗口透明的导航栏 -->

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

</style>

</resources>

此时效果为

2、在布局中第一个元素中添加如下属性

android:clipToPadding="true"

android:fitsSystemWindows="true"

属性的含义:

  • clipToPadding:控件的绘制区域是否在padding里面,值为true时绘制的区域就包括padding区域;
  • android:fitsSystemWindows:具体的作用就是你的contentview是否忽略actionbar、title、屏幕的底部虚拟按键,将整个屏幕当作可用的空间。正常情况,contentview可用的空间是去除了actionbar、title、底部按键的空间后剩余的可用区域,这个属性设置为true,则忽略,false则不忽略。简单来说,设置为true后,你的可用屏幕是整个屏幕,所以要注意,你的第一个控件是从状态栏那里开始布局的。

此时效果为

方式二:使用开源框架[废弃了]


https://github.com/jgilfelt/SystemBarTint

[DEPRECATED] Apply background tinting to the Android system UI when using KitKat translucent modes

设置状态栏颜色

Activity

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//为使用 ImageView 作为头部的界面设置状态栏透明

//StatusBarUtil.setTranslucentForImageView(Activity activity, int statusBarAlpha, View needOffsetView)

//为包含 DrawerLayout 的界面设置状态栏颜色(也可以设置半透明和全透明)

//StatusBarUtil.setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color)

}

private int num = 0;

public void click(View v) {

switch (num % 3) {

case 1:

//设置状态栏半透明

StatusBarUtil.setTranslucent(this, 50);//值需要在 0 ~ 255 之间

break;

case 2:

//设置状态栏全透明

StatusBarUtil.setTransparent(this);

break;

default:

//设置状态栏颜色

StatusBarUtil.setColor(this, 0xff0000);

break;

}

num++;

}

}

工具类

import android.annotation.TargetApi;

import android.app.Activity;

import android.content.Context;

import android.graphics.Color;

import android.os.Build;

import android.support.v4.widget.DrawerLayout;

import android.view.View;

import android.view.ViewGroup;

import android.view.WindowManager;

import android.widget.LinearLayout;

public class StatusBarUtil {

public static final int DEFAULT_STATUS_BAR_ALPHA = 112;//透明度默认值,在 0 ~ 255 之间

public static final int FAKE_STATUS_BAR_VIEW_ID = R.id.statusbarutil_fake_status_bar_view;

public static final int FAKE_TRANSLUCENT_VIEW_ID = R.id.statusbarutil_translucent_view;

/**

* 设置状态栏颜色

*

* @param activity 需要设置的 activity

* @param color    状态栏颜色值

*/

public static void setColor(Activity activity, int color) {

setColor(activity, color, DEFAULT_STATUS_BAR_ALPHA);

}

/**

* 设置状态栏颜色

*

* @param activity       需要设置的activity

* @param color          状态栏颜色值

* @param statusBarAlpha 状态栏透明度

*/

public static void setColor(Activity activity, int color, int statusBarAlpha) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//API 21,Android 5.0

activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

activity.getWindow().setStatusBarColor(calculateStatusColor(color, statusBarAlpha));

} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//API 19,Android 4.4

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

ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();

View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);

if (fakeStatusBarView != null) {

if (fakeStatusBarView.getVisibility() == View.GONE) {

fakeStatusBarView.setVisibility(View.VISIBLE);

}

fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha));

} else {

decorView.addView(createStatusBarView(activity, color, statusBarAlpha));

}

setRootView(activity);

}

}

/**

* 设置状态栏纯色 不加半透明效果

*

* @param activity 需要设置的 activity

* @param color    状态栏颜色值

*/

public static void setColorNoTranslucent(Activity activity, int color) {

setColor(activity, color, 0);

}


/**

* 设置状态栏颜色(5.0以下无半透明效果,不建议使用)

*

* @param activity 需要设置的 activity

* @param color    状态栏颜色值

*/

@Deprecated

public static void setColorDiff(Activity activity, int color) {

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {

return;

}

transparentStatusBar(activity);

ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);

// 移除半透明矩形,以免叠加

View fakeStatusBarView = contentView.findViewById(FAKE_STATUS_BAR_VIEW_ID);

if (fakeStatusBarView != null) {

if (fakeStatusBarView.getVisibility() == View.GONE) {

fakeStatusBarView.setVisibility(View.VISIBLE);

}

fakeStatusBarView.setBackgroundColor(color);

} else {

contentView.addView(createStatusBarView(activity, color));

}

setRootView(activity);

}

/**

* 使状态栏半透明

*

* 适用于图片作为背景的界面,此时需要图片填充到状态栏

*

* @param activity 需要设置的activity

*/

public static void setTranslucent(Activity activity) {

setTranslucent(activity, DEFAULT_STATUS_BAR_ALPHA);

}

/**

* 使状态栏半透明

*

* 适用于图片作为背景的界面,此时需要图片填充到状态栏

*

* @param activity       需要设置的activity

* @param statusBarAlpha 状态栏透明度,默认值是112,该值需要在 0 ~ 255 之间

*/

public static void setTranslucent(Activity activity, int statusBarAlpha) {

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {

return;

}

setTransparent(activity);

addTranslucentView(activity, statusBarAlpha);

}


/**

* 针对根布局是 CoordinatorLayout, 使状态栏半透明

*

* 适用于图片作为背景的界面,此时需要图片填充到状态栏

*

* @param activity       需要设置的activity

* @param statusBarAlpha 状态栏透明度

*/

public static void setTranslucentForCoordinatorLayout(Activity activity, int statusBarAlpha) {

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {

return;

}

transparentStatusBar(activity);

addTranslucentView(activity, statusBarAlpha);

}

/**

* 设置状态栏全透明

*

* @param activity 需要设置的activity

*/

public static void setTransparent(Activity activity) {

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {

return;

}

transparentStatusBar(activity);

setRootView(activity);

}

/**

* 使状态栏透明(5.0以上半透明效果,不建议使用)

* 适用于图片作为背景的界面,此时需要图片填充到状态栏

*

* @param activity 需要设置的activity

*/

@Deprecated

public static void setTranslucentDiff(Activity activity) {

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

// 设置状态栏透明

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

setRootView(activity);

}

}

/**

* 为DrawerLayout 布局设置状态栏变色

*

* @param activity     需要设置的activity

* @param drawerLayout DrawerLayout

* @param color        状态栏颜色值

*/

public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color) {

setColorForDrawerLayout(activity, drawerLayout, color, DEFAULT_STATUS_BAR_ALPHA);

}

/**

* 为DrawerLayout 布局设置状态栏颜色,纯色

*

* @param activity     需要设置的activity

* @param drawerLayout DrawerLayout

* @param color        状态栏颜色值

*/

public static void setColorNoTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color) {

setColorForDrawerLayout(activity, drawerLayout, color, 0);

}

/**

* 为DrawerLayout 布局设置状态栏变色

*

* @param activity       需要设置的activity

* @param drawerLayout   DrawerLayout

* @param color          状态栏颜色值

* @param statusBarAlpha 状态栏透明度

*/

public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color, int statusBarAlpha) {

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {

return;

}

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

activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

activity.getWindow().setStatusBarColor(Color.TRANSPARENT);

} else {

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

}

// 生成一个状态栏大小的矩形

// 添加 statusBarView 到布局中

ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);

View fakeStatusBarView = contentLayout.findViewById(FAKE_STATUS_BAR_VIEW_ID);

if (fakeStatusBarView != null) {

if (fakeStatusBarView.getVisibility() == View.GONE) {

fakeStatusBarView.setVisibility(View.VISIBLE);

}

fakeStatusBarView.setBackgroundColor(color);

} else {

contentLayout.addView(createStatusBarView(activity, color), 0);

}

// 内容布局不是 LinearLayout 时,设置padding top

if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {

contentLayout.getChildAt(1).setPadding(contentLayout.getPaddingLeft(), getStatusBarHeight(activity) + contentLayout.getPaddingTop(),

contentLayout.getPaddingRight(), contentLayout.getPaddingBottom());

}

// 设置属性

setDrawerLayoutProperty(drawerLayout, contentLayout);

addTranslucentView(activity, statusBarAlpha);

}

/**

* 设置 DrawerLayout 属性

*

* @param drawerLayout              DrawerLayout

* @param drawerLayoutContentLayout DrawerLayout 的内容布局

*/

private static void setDrawerLayoutProperty(DrawerLayout drawerLayout, ViewGroup drawerLayoutContentLayout) {

ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1);

drawerLayout.setFitsSystemWindows(false);

drawerLayoutContentLayout.setFitsSystemWindows(false);

drawerLayoutContentLayout.setClipToPadding(true);

drawer.setFitsSystemWindows(false);

}

/**

* 为DrawerLayout 布局设置状态栏变色(5.0以下无半透明效果,不建议使用)

*

* @param activity     需要设置的activity

* @param drawerLayout DrawerLayout

* @param color        状态栏颜色值

*/

@Deprecated

public static void setColorForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout, int color) {

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

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

// 生成一个状态栏大小的矩形

ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);

View fakeStatusBarView = contentLayout.findViewById(FAKE_STATUS_BAR_VIEW_ID);

if (fakeStatusBarView != null) {

if (fakeStatusBarView.getVisibility() == View.GONE) {

fakeStatusBarView.setVisibility(View.VISIBLE);

}

fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, DEFAULT_STATUS_BAR_ALPHA));

} else {

// 添加 statusBarView 到布局中

contentLayout.addView(createStatusBarView(activity, color), 0);

}

// 内容布局不是 LinearLayout 时,设置padding top

if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {

contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0);

}

// 设置属性

setDrawerLayoutProperty(drawerLayout, contentLayout);

}

}

/**

* 为 DrawerLayout 布局设置状态栏透明

*

* @param activity     需要设置的activity

* @param drawerLayout DrawerLayout

*/

public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) {

setTranslucentForDrawerLayout(activity, drawerLayout, DEFAULT_STATUS_BAR_ALPHA);

}

/**

* 为 DrawerLayout 布局设置状态栏透明

*

* @param activity     需要设置的activity

* @param drawerLayout DrawerLayout

*/

public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int statusBarAlpha) {

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {

return;

}

setTransparentForDrawerLayout(activity, drawerLayout);

addTranslucentView(activity, statusBarAlpha);

}

/**

* 为 DrawerLayout 布局设置状态栏透明

*

* @param activity     需要设置的activity

* @param drawerLayout DrawerLayout

*/

public static void setTransparentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) {

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {

return;

}

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

activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

activity.getWindow().setStatusBarColor(Color.TRANSPARENT);

} else {

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

}

ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);

// 内容布局不是 LinearLayout 时,设置padding top

if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {

contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0);

}

// 设置属性

setDrawerLayoutProperty(drawerLayout, contentLayout);

}

/**

* 为 DrawerLayout 布局设置状态栏透明(5.0以上半透明效果,不建议使用)

*

* @param activity     需要设置的activity

* @param drawerLayout DrawerLayout

*/

@Deprecated

public static void setTranslucentForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout) {

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

// 设置状态栏透明

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

// 设置内容布局属性

ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);

contentLayout.setFitsSystemWindows(true);

contentLayout.setClipToPadding(true);

// 设置抽屉布局属性

ViewGroup vg = (ViewGroup) drawerLayout.getChildAt(1);

vg.setFitsSystemWindows(false);

// 设置 DrawerLayout 属性

drawerLayout.setFitsSystemWindows(false);

}

}


/**

* 为头部是 ImageView 的界面设置状态栏全透明

*

* @param activity       需要设置的activity

* @param needOffsetView 需要向下偏移的 View

*/

public static void setTransparentForImageView(Activity activity, View needOffsetView) {

setTranslucentForImageView(activity, 0, needOffsetView);

}

/**

* 为头部是 ImageView 的界面设置状态栏透明(使用默认透明度)

*

* @param activity       需要设置的activity

* @param needOffsetView 需要向下偏移的 View

*/

public static void setTranslucentForImageView(Activity activity, View needOffsetView) {

setTranslucentForImageView(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView);

}

/**

* 为头部是 ImageView 的界面设置状态栏透明

*

* @param activity       需要设置的activity

* @param statusBarAlpha 状态栏透明度

* @param needOffsetView 需要向下偏移的 View

*/

public static void setTranslucentForImageView(Activity activity, int statusBarAlpha, View needOffsetView) {

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {

return;

}

setTransparentForWindow(activity);

addTranslucentView(activity, statusBarAlpha);

if (needOffsetView != null) {

ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) needOffsetView.getLayoutParams();

layoutParams.setMargins(layoutParams.leftMargin, layoutParams.topMargin + getStatusBarHeight(activity), layoutParams.rightMargin,

layoutParams.bottomMargin);

}

}

/**

* 为 fragment 头部是 ImageView 的设置状态栏透明

*

* @param activity       fragment 对应的 activity

* @param needOffsetView 需要向下偏移的 View

*/

public static void setTranslucentForImageViewInFragment(Activity activity, View needOffsetView) {

setTranslucentForImageViewInFragment(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView);

}

/**

* 为 fragment 头部是 ImageView 的设置状态栏透明

*

* @param activity       fragment 对应的 activity

* @param needOffsetView 需要向下偏移的 View

*/

public static void setTransparentForImageViewInFragment(Activity activity, View needOffsetView) {

setTranslucentForImageViewInFragment(activity, 0, needOffsetView);

}

/**

* 为 fragment 头部是 ImageView 的设置状态栏透明

*

* @param activity       fragment 对应的 activity

* @param statusBarAlpha 状态栏透明度

* @param needOffsetView 需要向下偏移的 View

*/

public static void setTranslucentForImageViewInFragment(Activity activity, int statusBarAlpha, View needOffsetView) {

setTranslucentForImageView(activity, statusBarAlpha, needOffsetView);

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

clearPreviousSetting(activity);

}

}

/**

* 隐藏伪状态栏 View

*

* @param activity 调用的 Activity

*/

public static void hideFakeStatusBarView(Activity activity) {

ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();

View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);

if (fakeStatusBarView != null) {

fakeStatusBarView.setVisibility(View.GONE);

}

View fakeTranslucentView = decorView.findViewById(FAKE_TRANSLUCENT_VIEW_ID);

if (fakeTranslucentView != null) {

fakeTranslucentView.setVisibility(View.GONE);

}

}

///////////////////////////////////////////////////////////////////////////////////

@TargetApi(Build.VERSION_CODES.KITKAT)

private static void clearPreviousSetting(Activity activity) {

ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();

View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);

if (fakeStatusBarView != null) {

decorView.removeView(fakeStatusBarView);

ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);

rootView.setPadding(0, 0, 0, 0);

}

}

/**

* 添加半透明矩形条

*

* @param activity       需要设置的 activity

* @param statusBarAlpha 透明值

*/

private static void addTranslucentView(Activity activity, int statusBarAlpha) {

ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);

View fakeTranslucentView = contentView.findViewById(FAKE_TRANSLUCENT_VIEW_ID);

if (fakeTranslucentView != null) {

if (fakeTranslucentView.getVisibility() == View.GONE) {

fakeTranslucentView.setVisibility(View.VISIBLE);

}

fakeTranslucentView.setBackgroundColor(Color.argb(statusBarAlpha, 0, 0, 0));

} else {

contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha));

}

}

/**

* 生成一个和状态栏大小相同的彩色矩形条

*

* @param activity 需要设置的 activity

* @param color    状态栏颜色值

* @return 状态栏矩形条

*/

private static StatusBarView createStatusBarView(Activity activity, int color) {

return createStatusBarView(activity, color, 0);

}

/**

* 生成一个和状态栏大小相同的半透明矩形条

*

* @param activity 需要设置的activity

* @param color    状态栏颜色值

* @param alpha    透明值

* @return 状态栏矩形条

*/

private static StatusBarView createStatusBarView(Activity activity, int color, int alpha) {

// 绘制一个和状态栏一样高的矩形

StatusBarView statusBarView = new StatusBarView(activity);

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));

statusBarView.setLayoutParams(params);

statusBarView.setBackgroundColor(calculateStatusColor(color, alpha));

statusBarView.setId(FAKE_STATUS_BAR_VIEW_ID);

return statusBarView;

}

/**

* 设置根布局参数

*/

private static void setRootView(Activity activity) {

ViewGroup parent = (ViewGroup) activity.findViewById(android.R.id.content);

for (int i = 0, count = parent.getChildCount(); i < count; i++) {

View childView = parent.getChildAt(i);

if (childView instanceof ViewGroup) {

childView.setFitsSystemWindows(true);

((ViewGroup) childView).setClipToPadding(true);

}

}

}

/**

* 设置透明

*/

private static void setTransparentForWindow(Activity activity) {

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

activity.getWindow().setStatusBarColor(Color.TRANSPARENT);

activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

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

activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

}

}

/**

* 使状态栏透明

*/

@TargetApi(Build.VERSION_CODES.KITKAT)

private static void transparentStatusBar(Activity activity) {

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

activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

activity.getWindow().setStatusBarColor(Color.TRANSPARENT);

} else {

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

}

}

/**

* 创建半透明矩形 View

*

* @param alpha 透明值

* @return 半透明 View

*/

private static StatusBarView createTranslucentStatusBarView(Activity activity, int alpha) {

// 绘制一个和状态栏一样高的矩形

StatusBarView statusBarView = new StatusBarView(activity);

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));

statusBarView.setLayoutParams(params);

statusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0));

statusBarView.setId(FAKE_TRANSLUCENT_VIEW_ID);

return statusBarView;

}

/**

* 获取状态栏高度

*

* @param context context

* @return 状态栏高度

*/

private static int getStatusBarHeight(Context context) {

// 获得状态栏高度

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

return context.getResources().getDimensionPixelSize(resourceId);

}

/**

* 计算状态栏颜色

*

* @param color color值

* @param alpha alpha值

* @return 最终的状态栏颜色

*/

private static int calculateStatusColor(int color, int alpha) {

if (alpha == 0) {

return color;

}

float a = 1 - alpha / 255f;

int red = color >> 16 & 0xff;

int green = color >> 8 & 0xff;

int blue = color & 0xff;

red = (int) (red * a + 0.5);

green = (int) (green * a + 0.5);

blue = (int) (blue * a + 0.5);

return 0xff << 24 | red << 16 | green << 8 | blue;

}

}

布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#5c0"

android:clipToPadding="true"

android:fitsSystemWindows="true"

android:orientation="vertical" >

<TextView

android:layout_width="match_parent"

android:layout_height="match_parent"

android:onClick="click"

android:text="沉浸式状态栏"

android:textColor="#f00"

android:textSize="15sp" />

</LinearLayout>

样式

<resources>

<style name="AppBaseTheme" parent="android:Theme.Light"></style>

<style name="AppTheme" parent="AppBaseTheme">

<!-- 隐藏标题栏 -->

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

<!-- 窗口透明的状态栏 -->

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

<!-- 窗口透明的导航栏 -->

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

</style>

</resources>

ids.xml

<?xml version="1.0" encoding="utf-8"?>

<resources>

<item type="id" name="statusbarutil_fake_status_bar_view" />

<item type="id" name="statusbarutil_translucent_view" />

</resources>

null

附件列表

时间: 2024-07-28 22:00:43

沉浸式状态栏 设置状态栏颜色的相关文章

Android App 沉浸式状态栏解决方案

伴随着 Android 5.0 发布的 Material Design,让 Android 应用告别了以前的工程师审美,迎来了全新的界面,灵动的交互,也让越来越多的 App 开始遵从 material design 设计原则,不再是以前拿着iOS设计稿,做着Android开发.本文就其中的沉浸式状态栏这一特性,描述其兼容到4.4的实现,以及一些使用中的小细节. 前言 在4.4之前状态栏一直是黑色的,在4.4中带来了 windowTranslucentStatus 这一特性,因此可以实现给状态栏设

Android设置沉浸式状态栏时改变状态栏的颜色(只对MIUI V6可用)

Android支持在API 19及以上使用沉浸式状态,但在MIUI V6下如果扩展的颜色比较浅,会导致状态栏的文字无法看清. 在Android4.4设备上支持沉浸式状态栏,只需要添加values-v19/styles.xml 下添加 <style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.NoActionBar"> <item name="android:window

沉浸式导航栏及状态栏系统图标颜色的改变

最近研究沉浸式导航栏,上网看了好多,差不多实现都是一样的....代码如下: //透明状态栏getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明导航栏getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); 没有判断版本 需要的自己配置.... 不过这样又有新的问题 1:如果有文字内容 内容会与状态栏

android沉浸式状态栏、变色状态栏、透明状态栏、修改状态栏颜色及透明

首先我要区分清楚沉浸式状态栏与变色状态栏. 沉浸式状态栏指的是,状态栏隐藏,在手指做了相关操作后,状态栏显示出来,例如视频播放器,在播放视频时是隐藏状态栏的,但是点击屏幕的时候,状态栏会显示出来,再例如文本阅读器,在阅读的时候是全屏的,然后从屏幕上方下滑或者下方上划,虚拟键和状态栏出现了,但却是直接覆盖在程序文字上的,这是所谓的沉浸式状态栏. 那么大家平时所说的状态栏与导航栏颜色相同,或者透明,指的是变色状态栏,或者透明状态栏. 对于这两个概念的理解,大家可以参考http://www.andro

android 沉浸式状态栏(像ios那样的状态栏与应用统一颜色样式)

这个特性是andorid4.4支持的,最少要api19才干够使用.以下介绍一下使用的方法,很得简单: 添加一个demo源代码: https://github.com/ws123/StatusDemo public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCon

android沉浸式状态栏设置(4.4以上版本)

其实设置比较简单,我用了小米和htc的几款机型都可以用. 主要代码就是这个(注意要在Activity的setContentView之前调用才行) /** * 开启沉浸式状态栏 * */ public static void openImmerseStatasBarMode(Activity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window window = activity.getWindo

Android 沉浸式状态栏

效果图 android 5.0 以上 android 4.4 API 19 以上都是原生安卓系统的效果,具体到国内的各种各样改过的系统可能会有细微差别,测试过小米和华为的机器效果基本一样. 实现 1.修改主题属性 方法一: 在values-v19文件夹下声明AppTheme为透明状态栏,代码如下 1 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 2 <!-- C

8.Android 系统状态栏沉浸式/透明化解决方案

转载:http://www.jianshu.com/p/34a8b40b9308 前言 网上已经有很多有关于系统状态栏的解决方案,这篇文章也不会有什么新奇的解决方案,都是本人经过自己试验,统计提炼出来的相对靠谱的一套解决方案.如果是android大牛可以忽略本文,怕让您贱笑.只面向小白,帮助小白减少摸索的时间. 关于术语 网上有很多争论: 你这状态栏是变色龙状态栏,不是沉浸式的这应该是沉浸式的状态栏吧,系统栏与actionbar颜色设为一致 我只想说去你妹的,老子只要自己的app的状态栏能和主题

81.Android之沉浸式状态栏攻略

转载:http://blog.csdn.net/lmj623565791/article/details/48649563/ 一.概述 近期注意到QQ新版使用了沉浸式状态栏,ok,先声明一下:本篇博客效果下图: 关于这个状态栏变色到底叫「Immersive Mode」/「Translucent Bars」有兴趣可以去 为什么在国内会有很多用户把 ?透明栏?(Translucent Bars)称作 ?沉浸式顶栏??上面了解了解,请勿指点我说的博文标题起得不对,thx. 恩,接下来正题. 首先只有大