Android 沉浸式狀態(tài)欄的三種實現(xiàn)方式

轉載?若蘭明月

沉浸式狀態(tài)欄

Google從android kitkat(Android 4.4)開始,給我們開發(fā)者提供了一套能透明的系統(tǒng)ui樣式給狀態(tài)欄和導航欄捏检,這樣的話就不用向以前那樣每天面對著黑乎乎的上下兩條黑欄了旧找,還可以調(diào)成跟Activity一樣的樣式林束,形成一個完整的主題,和IOS7.0以上系統(tǒng)一樣了保礼。

首先看下效果

三種方式實現(xiàn)沉浸式狀態(tài)欄

首先看下第一種方式

系統(tǒng)的方式沉浸式狀態(tài)欄實現(xiàn)

步奏一

//當系統(tǒng)版本為4.4或者4.4以上時可以使用沉浸式狀態(tài)欄

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

//透明狀態(tài)欄

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

//透明導航欄

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

}

步奏二

布局加入:

android:fitsSystemWindows="true"

android:clipToPadding="true"

我們看下activity和布局文件

FirstActivity.java:

/**

* 沉浸式狀態(tài)欄

*/

private void initState() {

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

//透明狀態(tài)欄

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

//透明導航欄

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

}

}

activity_first.xml:


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

android:layout_width="match_parent"

android:layout_height="match_parent">

android:fitsSystemWindows="true"

android:clipToPadding="true"

android:layout_width="match_parent"

android:layout_height="140dp"

android:textSize="24dp"

android:background="@color/mask_tags_1"

android:text="你好,沉浸式狀態(tài)欄"/>

接著看下第二種方式

實現(xiàn)思路,添加隱藏布局,然后我們動態(tài)的計算狀態(tài)欄的高度硼莽,然后把這個高度設置成這個隱藏的布局的高度,便可以實現(xiàn)

在這里我們通過反射來獲取狀態(tài)欄的高度

/**

* 通過反射的方式獲取狀態(tài)欄高度

*

* @return

*/

private int getStatusBarHeight() {

try {

Class c = Class.forName("com.android.internal.R$dimen");

Object obj = c.newInstance();

Field field = c.getField("status_bar_height");

int x = Integer.parseInt(field.get(obj).toString());

return getResources().getDimensionPixelSize(x);

} catch (Exception e) {

e.printStackTrace();

}

return 0;

}

來看下SecondActivity和布局文件吧

SecondActivity.java

package com.example.translucentbarstest;

import android.os.Build;

import android.os.Bundle;

import android.support.annotation.Nullable;

import android.support.v7.app.AppCompatActivity;

import android.view.View;

import android.view.WindowManager;

import android.widget.LinearLayout;

import java.lang.reflect.Field;

/**

* Created by 若蘭 on 2016/1/22.

* 一個懂得了編程樂趣的小白煮纵,希望自己

* 能夠在這個道路上走的很遠懂鸵,也希望自己學習到的

* 知識可以幫助更多的人,分享就是學習的一種樂趣

* QQ:1069584784

* csdn:http://blog.csdn.net/wuyinlei

*/

public class SecondActivity extends AppCompatActivity {

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_two);

initState();

}

/**

* 動態(tài)的設置狀態(tài)欄? 實現(xiàn)沉浸式狀態(tài)欄

*

*/

private void initState() {

//當系統(tǒng)版本為4.4或者4.4以上時可以使用沉浸式狀態(tài)欄

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

//透明狀態(tài)欄

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

//透明導航欄

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

//

LinearLayout linear_bar = (LinearLayout) findViewById(R.id.ll_bar);

linear_bar.setVisibility(View.VISIBLE);

//獲取到狀態(tài)欄的高度

int statusHeight = getStatusBarHeight();

//動態(tài)的設置隱藏布局的高度

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) linear_bar.getLayoutParams();

params.height = statusHeight;

linear_bar.setLayoutParams(params);

}

}

/**

* 通過反射的方式獲取狀態(tài)欄高度

*

* @return

*/

private int getStatusBarHeight() {

try {

Class c = Class.forName("com.android.internal.R$dimen");

Object obj = c.newInstance();

Field field = c.getField("status_bar_height");

int x = Integer.parseInt(field.get(obj).toString());

return getResources().getDimensionPixelSize(x);

} catch (Exception e) {

e.printStackTrace();

}

return 0;

}

}

activity_second.xml:


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

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

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.example.translucentbarstest.TwoActivity">


android:id="@+id/ll_bar"

android:layout_width="fill_parent"

android:layout_height="1dp"

android:orientation="vertical"

android:background="#e7abff"

android:visibility="gone">

android:fitsSystemWindows="true"

android:clipToPadding="true"

android:layout_width="match_parent"

android:layout_height="140dp"

android:background="@color/mask_tags_3"

android:text="你好,沉浸式狀態(tài)欄"/>

接下來看下第三種

這個是用的github上的第三方庫

1.庫地址:https://github.com/jgilfelt/SystemBarTint

2.添加依賴庫:

compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'

步奏一

android:fitsSystemWindows="true"

android:clipToPadding="true

步奏二

SystemBarTintManager tintManager = new SystemBarTintManager(this);

// 激活狀態(tài)欄

tintManager.setStatusBarTintEnabled(true);

// enable navigation bar tint 激活導航欄

tintManager.setNavigationBarTintEnabled(true);

//設置系統(tǒng)欄設置顏色

//tintManager.setTintColor(R.color.red);

//給狀態(tài)欄設置顏色

tintManager.setStatusBarTintResource(R.color.mask_tags_1);

//Apply the specified drawable or color resource to the system navigation bar.

//給導航欄設置資源

tintManager.setNavigationBarTintResource(R.color.mask_tags_1);

來看下代碼吧

ThreeActivity.java

package com.example.translucentbarstest;

import android.os.Build;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.view.WindowManager;

import com.readystatesoftware.systembartint.SystemBarTintManager;

/**

* Created by 若蘭 on 2016/1/22.

* 一個懂得了編程樂趣的小白行疏,希望自己

* 能夠在這個道路上走的很遠匆光,也希望自己學習到的

* 知識可以幫助更多的人,分享就是學習的一種樂趣

* QQ:1069584784

* csdn:http://blog.csdn.net/wuyinlei

*/

public class ThreeActivity extends AppCompatActivity{

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_three);

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

//透明狀態(tài)欄

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

//透明導航欄

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

SystemBarTintManager tintManager = new SystemBarTintManager(this);

// 激活狀態(tài)欄

tintManager.setStatusBarTintEnabled(true);

// enable navigation bar tint 激活導航欄

tintManager.setNavigationBarTintEnabled(true);

//設置系統(tǒng)欄設置顏色

//tintManager.setTintColor(R.color.red);

//給狀態(tài)欄設置顏色

tintManager.setStatusBarTintResource(R.color.mask_tags_1);

//Apply the specified drawable or color resource to the system navigation bar.

//給導航欄設置資源

tintManager.setNavigationBarTintResource(R.color.mask_tags_1);

}

}

}

activity_three.xml:


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

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

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#ffff"

android:orientation="vertical"

tools:context="com.example.translucentbarstest.ThirdActivity">

android:layout_width="match_parent"

android:layout_height="140dp"

android:background="@color/mask_tags_5"

android:clipToPadding="true"

android:fitsSystemWindows="true"

android:text="你好,沉浸式狀態(tài)欄"

android:textSize="24dp"/>

好了酿联,原來自己以為沉浸式狀態(tài)欄聽著好厲害(有可能自己原先不知道)终息,但是真正自己去做了夺巩,去了解了,也沒有那么難周崭、那么神秘了劲够,我想這也是自己成長了一些。

繼續(xù)努力休傍。這個是上傳的github上的demohttps://github.com/wuyinlei/-,如有疑問蹲姐,歡迎交流

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磨取,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子柴墩,更是在濱河造成了極大的恐慌忙厌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件江咳,死亡現(xiàn)場離奇詭異逢净,居然都是意外死亡,警方通過查閱死者的電腦和手機歼指,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門爹土,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人踩身,你說我怎么就攤上這事胀茵。” “怎么了挟阻?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵琼娘,是天一觀的道長。 經(jīng)常有香客問我附鸽,道長脱拼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任坷备,我火速辦了婚禮熄浓,結果婚禮上,老公的妹妹穿的比我還像新娘省撑。我一直安慰自己玉组,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布丁侄。 她就那樣靜靜地躺著惯雳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸿摇。 梳的紋絲不亂的頭發(fā)上石景,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音,去河邊找鬼潮孽。 笑死揪荣,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的往史。 我是一名探鬼主播仗颈,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼椎例!你這毒婦竟也來了挨决?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤订歪,失蹤者是張志新(化名)和其女友劉穎脖祈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刷晋,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡盖高,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了眼虱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喻奥。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捏悬,靈堂內(nèi)的尸體忽然破棺而出映凳,到底是詐尸還是另有隱情,我是刑警寧澤邮破,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布诈豌,位于F島的核電站,受9級特大地震影響抒和,放射性物質(zhì)發(fā)生泄漏矫渔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一摧莽、第九天 我趴在偏房一處隱蔽的房頂上張望庙洼。 院中可真熱鬧,春花似錦镊辕、人聲如沸油够。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽石咬。三九已至,卻和暖如春卖哎,著一層夾襖步出監(jiān)牢的瞬間鬼悠,已是汗流浹背删性。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留焕窝,地道東北人蹬挺。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像它掂,于是被迫代替她去往敵國和親巴帮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容