前言
為沈河等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及沈河網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、沈河網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
qq最近更新搞了漸變式狀態(tài)欄.然后...新需求就是要加這個(gè).唉
先來(lái)張效果圖:
常見(jiàn)的方式:
設(shè)置Theme,狀態(tài)欄透明.
- true
實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單.
比如:SystemBarTint
幾行代碼搞定了.
但是.我要潑冷水,這種方式會(huì)引起這些問(wèn)題:
1.軟鍵盤(pán)彈起bug
2.fragment不適應(yīng)
這種方式的優(yōu)點(diǎn):
兼容到4.4
我的看法:
1.用全屏模式或者狀態(tài)欄透明的方式去實(shí)現(xiàn),感覺(jué)很勉強(qiáng)
2.為了一個(gè)statusbar的效果,然后去處理一大堆不適應(yīng),我認(rèn)為是不值得的.特別是軟鍵盤(pán)彈出的問(wèn)題
3.如果為了適配4.4,要費(fèi)這么大功夫的話(huà)...
我的實(shí)現(xiàn)方式:
1.拿到StatusBar:
很簡(jiǎn)單,翻翻DecorView源碼,就能知道,是通過(guò)ColorViewState 配置創(chuàng)建的View.
由于是私有成員,要拿到對(duì)應(yīng)的參數(shù),一般做法是使用反射.
這里我取了點(diǎn)巧,既然是View,那么就能findviewbyId找到
只要想辦法拿到com.android.internal.R.id.statusBarBackground這個(gè)id值就行了
private void initStatusBar() { if (statusBarView == null) { //android系統(tǒng)級(jí)的資源id得這么拿,不然拿不到 int identifier = getResources().getIdentifier("statusBarBackground", "id", "android"); statusBarView = getWindow().findViewById(identifier); } if (statusBarView != null) { statusBarView.setBackgroundResource("你的漸變drawable資源id"); } }
2.等StatusBar繪制完成
如果你直接在onCreate中調(diào)用上面的方法,你會(huì)發(fā)現(xiàn),拿到的是null.
這是因?yàn)镾tatusbar還沒(méi)繪制完成.
所以,可以在onCreate()中使用Looper.myQueue().addIdleHandler()來(lái)保證Statusbar繪制完成后再findview.
然后對(duì)DecorView設(shè)置addOnLayoutChangeListener監(jiān)聽(tīng)
當(dāng)布局發(fā)生變化,就設(shè)置statusbar的背景
Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() { @Override public boolean queueIdle() { if (isStatusBar()) { initStatusBar(); getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { initStatusBar(); } }); } return false; } });
3.為什么要addOnLayoutChangeListener:
其實(shí)不加監(jiān)聽(tīng),也能實(shí)現(xiàn)改變statusbar顏色的效果..但是會(huì)出現(xiàn)問(wèn)題
比如彈軟鍵盤(pán)后,彈popwindow后,引起window狀態(tài)改變時(shí),statusbar的顏色就會(huì)復(fù)原...
基本完整的代碼
private View statusBarView; @Override protected void onCreate(Bundle savedInstanceState) { //延時(shí)加載數(shù)據(jù). Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() { @Override public boolean queueIdle() { if (isStatusBar()) { initStatusBar(); getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { initStatusBar(); } }); } //只走一次 return false; } }); } private void initStatusBar() { if (statusBarView == null) { int identifier = getResources().getIdentifier("statusBarBackground", "id", "android"); statusBarView = getWindow().findViewById(identifier); } if (statusBarView != null) { statusBarView.setBackgroundResource("你的漸變drawable資源id"); } } protected boolean isStatusBar() { return true; }
這種方式的缺點(diǎn):
1.因?yàn)闆](méi)有使用全屏的模式,所以適配4.4是沒(méi)戲了.
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。