關(guān)鍵代碼:
成都創(chuàng)新互聯(lián)公司-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比龍港網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式龍港網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋龍港地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。
BaseActivity
if (Build.VERSION.SDK_INT = Build.VERSION_CODES.LOLLIPOP) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//這就是透明
}
//透明之后所有的頭部都會(huì)頂上來(lái),然后就是加paddingtop了
//頭部layout公用,rl_title_content是最外層的RelativeLayout。
RelativeLayout rl_title_content = findViewById(R.id.rl_title_content);
if (rl_title_content != null) {
//getStatusBarHeight是獲取狀態(tài)欄的高度的
rl_title_content.setPadding(0,Utils.getStatusBarHeight(this),0,0);//左上右下
}
public static int getStatusBarHeight(Context context) {
Class? c = null;
Object obj = null;
Field field = null;
int x = 0, sbar = 0;
try {
c = Class.forName("com.android.internal.R$dimen");
obj = c.newInstance();
field = c.getField("status_bar_height");
x = Integer.parseInt(field.get(obj).toString());
sbar = context.getResources().getDimensionPixelSize(x);
} catch (Exception e1) {
e1.printStackTrace();
}
return sbar;
}
Android開(kāi)發(fā)中,經(jīng)常需要實(shí)現(xiàn)下圖狀態(tài)欄的效果,類(lèi)似于沉浸式狀態(tài)欄,但這里僅僅是討論設(shè)置狀態(tài)欄的顏色和狀態(tài)欄上面文字、圖標(biāo)的顏色的方法。
Android 4.4(API 19)之后,就提供了修改狀態(tài)欄顏色的方法,但是在 Android 6.0(API 23)之后,才支持修改狀態(tài)欄上面的文字和圖標(biāo)顏色,默認(rèn)是白色的。所以會(huì)導(dǎo)致一個(gè)問(wèn)題,在 4.4 到 6.0 之間的系統(tǒng),狀態(tài)欄設(shè)置為淺色的話,狀態(tài)欄上面白色的文字和圖標(biāo)會(huì)看不清,像下面這樣:
有一些第三方的系統(tǒng)提供了設(shè)置狀態(tài)欄和狀態(tài)欄文字、圖標(biāo)顏色的方法,比如小米的MIUI和魅族的Flyme,所以考慮了下比較好的實(shí)現(xiàn)方式是:
當(dāng)然,這里面也會(huì)有坑,比如 MIUI 提供的修改狀態(tài)欄字體顏色方法會(huì)跟 Android 系統(tǒng)自帶的方法沖突,官方說(shuō)明如下: 關(guān)于MIUI狀態(tài)欄字符顏色邏輯調(diào)整說(shuō)明
經(jīng)過(guò)網(wǎng)上的資料和自己的嘗試,MIUI 系統(tǒng)還是同時(shí)使用 MIUI 提供的方法和 Android 系統(tǒng)自帶的方法來(lái)修改狀態(tài)欄字體顏色比較保險(xiǎn)。
基于上面的思考,封裝了設(shè)置 Android 4.4 以上系統(tǒng)狀態(tài)欄顏色和狀態(tài)欄字體、圖標(biāo)顏色的方法:
要在 Application Theme 加上 item name="android:fitsSystemWindows"true/item ,不然頁(yè)面會(huì)頂?shù)綘顟B(tài)欄上面,或者在 Activity 的布局里面加上 android:fitsSystemWindows="true" 和 android:clipToPadding="false" 也可以。
最終實(shí)現(xiàn)的效果如下:
大家有更好的方案可以告訴我~
參考如下內(nèi)容:
android4.4 以下修改狀態(tài)欄顏色的方法為:
1、首先會(huì)懂得反編譯,電腦上要安裝java環(huán)境和反編譯工具。沒(méi)有的百度搜索下載安裝。這里就不多說(shuō)了。
2、要準(zhǔn)備一個(gè)framework-res.apk放在一邊待用,把framework-res.apk復(fù)制到反編譯工具里、反編譯framework-res.apk后打開(kāi)res\values\styles.xml。
3、直接搜索以下代碼
style name="TextAppearance.StatusBar" parent="@style/TextAppearance"
你會(huì)看見(jiàn)style name="TextAppearance.StatusBar" parent="@style/TextAppearance"
item name="textSize"14.0sp/item
item name="textStyle"normal/item
item name="textColor"?textColorPrimary/item
/style 然后修改這一段代碼item name="textColor"?textColorPrimary/item 為 item name="textColor"#ff000000/item
000000為顏色代碼 想要什么顏色就修改成自己喜歡的顏色就可以了 顏色對(duì)照表可以參考
4、然后回編譯?;鼐幾g完成后用電腦上的壓縮軟件打開(kāi)回編譯好的framework-res.apk,拖出里面的resources.arsc替換進(jìn)事先準(zhǔn)備好的framework-res.apk里就可以了。然后用復(fù)制到內(nèi)存卡 用RE復(fù)制或者移動(dòng)到system里 修改權(quán)限 3 1 0,在移動(dòng)到framework里覆蓋就可以了。關(guān)機(jī)重啟,狀態(tài)欄的通知內(nèi)容顏色也變了。
先看一下默認(rèn)的情況:
藍(lán)色一行是自定義的導(dǎo)航欄,
黑色的是自帶的 ActionBar ,也就是我們說(shuō)的標(biāo)題欄。
首先一般都會(huì)選擇去掉 ActionBar:
隱藏 actionbar 有很多種方法
這種方法是全局中隱藏了標(biāo)題欄。
其實(shí)在我的手機(jī)更新系統(tǒng)之前,隱藏了 ActionBar 后,狀態(tài)欄和自定義的導(dǎo)航欄顏色是相匹配的,不知道什么原因現(xiàn)在默認(rèn)為灰色了。
上面使用的主題雖然隱藏了標(biāo)題欄,但是和我們自定義的導(dǎo)航欄不搭,
這時(shí)候我們可以選擇用自定義的主題(Theme),來(lái)改變狀態(tài)欄:
在 values 下的 style.xml 中添加
或者在 onCreate 中:
上面兩行一般不一起設(shè)置,二選一即可。
第一行設(shè)置導(dǎo)航欄為透明,第二行將導(dǎo)航欄隱藏。
不推薦第二種做法,如果一個(gè) Activity 中設(shè)置了隱藏導(dǎo)航欄而另一個(gè) Activity 沒(méi)有,那兩者切換的時(shí)候會(huì)不好看。
融合的效果:
狀態(tài)欄和 app 頂部相融合了,如果標(biāo)題欄是一張圖片效果會(huì)更好。
這里還有一個(gè)問(wèn)題,狀態(tài)欄的文字和我們導(dǎo)航欄的文字重疊了,
我們可以選擇在布局文件的根元素中添加:
讓布局為狀態(tài)欄留出空間,就不會(huì)出現(xiàn)上面這張被狀態(tài)欄遮擋的情況。
如果像上面的例子是一樣的純色的標(biāo)題欄,我們可以選擇直接改變狀態(tài)欄的顏色解決問(wèn)題。
或者:
不顯示時(shí)間、電量等信息和文字:
同要可以用修改 Theme 來(lái)實(shí)現(xiàn):
或者在 OnCreat() 中加入,還是要注意加在 setContentView() 的前面
如果想讓圖片全屏要注意設(shè)置為:
前言:最近項(xiàng)目大量用到狀態(tài)欄透明,網(wǎng)上也出現(xiàn)很多庫(kù)可以直接拿來(lái)用,個(gè)人認(rèn)為沒(méi)有必要那么重引用到一個(gè)庫(kù)(有木有同學(xué)和我有一樣的想法),所以研究了一番,在此做個(gè)記錄加強(qiáng)記憶也便后期查閱,如果無(wú)意中有幸能幫助到你那就再好不過(guò)了。
Android 從 4.4 (SDK 19) 開(kāi)始支持 系統(tǒng)欄(狀態(tài)欄+導(dǎo)航欄)半透明 效果:
翻譯一下就是:
TranslucentDecor 主題設(shè)置了兩個(gè)屬性 windowTranslucentStatus 和 windowTranslucentNavigation 都為 true,前者指定狀態(tài)欄半透明、后者指定導(dǎo)航欄半透明。
本文只探討“狀態(tài)欄” 。
默認(rèn)樣式是這樣:
可見(jiàn) Toolbar 和系統(tǒng)狀態(tài)欄之間有明顯的分界,我們要實(shí)現(xiàn)的效果是 Toolbar 和狀態(tài)欄背景統(tǒng)一,看起來(lái)像是一個(gè)整體(自行腦補(bǔ)圖片)。
按照官方文檔,我們自定義主題:
對(duì)應(yīng)的 Activity 引用該主題:
我看來(lái)看看效果:
雖然實(shí)現(xiàn)了半透明,但是布局被狀態(tài)欄覆蓋,接下來(lái)在布局文件中設(shè)置 fitSystemWindows (注意加到根節(jié)點(diǎn) ConstraintLayout 上):
來(lái)看看效果:
雖然布局沒(méi)有被狀態(tài)欄覆蓋,但是狀態(tài)欄背景顯然這不是我們想要的效果????
為什么狀態(tài)欄會(huì)這么奇怪?
文章開(kāi)頭的定義中我們說(shuō)了,布局文件會(huì)延伸到狀態(tài)欄所占區(qū)域下, fitsSystemWindows 的作用是給對(duì)應(yīng)的 View 增加 padding(這里以 ConstraintLayout 為例),目的是為了讓其內(nèi)容不被狀態(tài)欄遮擋。
在我們的布局文件中 ConstraintLayout 沒(méi)有設(shè)置背景(默認(rèn)白色),所以狀態(tài)欄默認(rèn)的半透明背景色和 ConstraintLayout 的白色背景疊加,就變成了上圖中的效果。
【總結(jié)】?jī)蓚€(gè)基本概念:
1、 windowTranslucentStatus 設(shè)置為true之后,狀態(tài)欄默認(rèn)是 半透明 的(4.4 是黑色到透明色漸變,5.0+ 是純黑色半透明),和我們要求的 透明 相去甚遠(yuǎn)。更重要的是,布局會(huì)延伸到狀態(tài)欄底下。
2、 android:fitsSystemWindows 簡(jiǎn)單理解 就是 View 為了適配系統(tǒng)狀態(tài)欄和導(dǎo)航欄(不被遮擋)自動(dòng) 增加 padding ,當(dāng)然真正的實(shí)現(xiàn)原理比這復(fù)雜很多而且不同的 View 可以自定義實(shí)現(xiàn)方式。
所以,為了實(shí)現(xiàn)文章開(kāi)頭提出來(lái)的“狀態(tài)欄透明”效果,我們需要處理:
設(shè)置 windowTranslucentStatus 為 true,讓狀態(tài)欄半透明。
在根節(jié)點(diǎn)設(shè)置 android:fitsSystemWindows 使其不被狀態(tài)欄遮擋。
Android 4.4 暫時(shí)沒(méi)有辦法去掉狀態(tài)欄的漸變。
Android 5.0+ 開(kāi)始支持修改狀態(tài)欄顏色,設(shè)置透明色即可把半透明去掉。
看看效果:
我們看到即使?fàn)顟B(tài)欄透明了,但是其底色是一片白,因?yàn)楦?jié)點(diǎn) ConstraintLayout 沒(méi)有設(shè)置背景,大多情況下我們不會(huì)給整個(gè)跟節(jié)點(diǎn)設(shè)置顏色,可以考慮把 android:fitsSystemWindows 設(shè)置到子 View 上,本例中是 AppBarLayout (5.0+ 無(wú)效,只能顯式給 AppBarLayout 加 padding,可以利用其背景色),實(shí)際項(xiàng)目中可靈活調(diào)整。
最終效果:
至此,完成狀態(tài)欄透明效果,網(wǎng)上有很多庫(kù),實(shí)際上都是基于此原理,在此基礎(chǔ)上再自定義 View 做為狀態(tài)欄背景。