51_Android设置状态栏透明与设置状态栏字体颜色Mode

Android基础汇总

@[toc]

#1 概念:

变色状态栏(透明状态栏):指的是状态栏与导航栏颜色相同,或者透明

沉浸式状态栏:,状态栏隐藏,在手指做了相关操作后,状态栏显示出来,例如视频播放器,在播放视频时是隐藏状态栏的,但是点击屏幕的时候,状态栏会显示出来,再例如文本阅读器,在阅读的时候是全屏的,然后从屏幕上方下滑或者下方上划,虚拟键和状态栏出现了,但却是直接覆盖在程序文字上的,这是所谓的沉浸式状态栏。 

 

#2 效果图

(1)透明效果:

a. android 4.4以下不起作用(注意兼容):

aa

 

b. 4.4和5.0以上(5.0以上要调用另外的标记重新设置Flag,不然状态栏会有灰色的透明阴影效果)

aa

 

 

(2)修改状态栏字体颜色(6.0以下不起效果,不能直接设置,而是通过两种模式,魅族、小米有对应暴露方法,但本文得考虑所有机型)

aa

修改之后:

aa

 

 

#3Demo地址:

http://download.csdn.net/detail/baopengjian/9806226

 

#4 代码:

(1)布局

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

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

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/activity_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:fitsSystemWindows="false"

tools:context="transparentstatus.pbj.net.transparentstatus.MainActivity">



<View

android:id="@+id/status_bar"

android:layout_width="match_parent"

android:layout_height="0dp"

android:background="@android:color/holo_red_light" />



<LinearLayout

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_below="@id/status_bar"

android:orientation="vertical">



<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="根布局为RelativeLayout时设置status_bar背景" />

<Button

android:onClick="changeColor"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="修改status_bar颜色" />

<Button

android:onClick="goLinerLayout"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="跳转LinearLayout根布局" />

<Button

android:onClick="changeMode"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textColor="@android:color/holo_blue_light"

android:text="修改Mode" />

</LinearLayout>



</RelativeLayout>

(2)工具类

/**

* 设置状态栏透明工具类

* Created by baopengjian on 2017/4/7.

*/



public class UtilsStyle {



/**

* 布局中必须有一个id为status_bar的view来设置状态栏背景

* 必须要在 setContentView之后调用

*  onCrete中,onContentChange之前

* @param activity 当前页面

*/

public static void setTranslateStatusBar(Activity activity) {

    // 4.4以上处理

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // android
    
               activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    // 状态栏透明

        View status_bar = activity.findViewById(R.id.status_bar);// 标题栏id

        if (status_bar != null) {
    
            ViewGroup.LayoutParams params = status_bar.getLayoutParams();
        
            params.height = getStatusBarHeight(activity);

            status_bar.setLayoutParams(params);
    
        }

    }

    //5.0 以上处理

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

        Window window = 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);

    }

}





private static int getStatusBarHeight(Context context) {

    int result = 0;

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

"dimen", "android");

    if (resourceId > 0) {

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

    }

    return result;

}



/**

* Flag只有在使用了FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS

* 并且没有使用 FLAG_TRANSLUCENT_STATUS的时候才有效,也就是只有在状态栏全透明的时候才有效。

* @param activity

* @param bDark

*/

public static void setStatusBarMode(Activity activity, boolean bDark) {

    //6.0以上

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

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

        if (decorView != null) {

            int vis = decorView.getSystemUiVisibility();

            if (bDark) {

                vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;

            } else {

                vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;

            }

            decorView.setSystemUiVisibility(vis);

        }

    }

    }

}

(3)使用

public class MainActivity extends AppCompatActivity {



private boolean isRed = true;

private boolean isDarkMode = true;

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    //注意使用位置在setContentView后,onContentChange之前
    UtilsStyle.setTranslateStatusBar(this);

}



public void changeColor(View v){

View status_bar = findViewById(R.id.status_bar);

if(isRed){

status_bar.setBackgroundResource(android.R.color.holo_blue_light);

}else{

status_bar.setBackgroundResource(android.R.color.holo_red_light);

}

isRed = !isRed;

}



public void goLinerLayout(View v){

startActivity(new Intent(MainActivity.this,LinearRootActivity.class));

}



public void changeMode(View v){

UtilsStyle.setStatusBarMode(this,!isDarkMode);

isDarkMode = !isDarkMode;

}

}





 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值