真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android中怎么實(shí)現(xiàn)一個沉浸式狀態(tài)欄

Android中怎么實(shí)現(xiàn)一個沉浸式狀態(tài)欄,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

為湘東等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及湘東網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站制作、湘東網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

導(dǎo)航欄問題

在Android中,頂部導(dǎo)航欄目前常用的兩種實(shí)現(xiàn)方式,一個是通過Toolbar,一個是通過自定義View的方式來實(shí)現(xiàn)。兩種方式各有利弊。Toolbar為官方指定規(guī)范,開發(fā)者使用更方便,但可拓展性差,對于一些特殊的展示效果無法實(shí)現(xiàn),而通過自定義方式的方式,可以支持更多展示效果,但卻需要我們寫更多的代碼。兩種方式在實(shí)現(xiàn)狀態(tài)欄沉浸上也有所差別。

去掉Title

  • Toolbar默認(rèn)主題會具有一個title,當(dāng)我們使用Toolbar的時候,而沒有去掉title,應(yīng)用則會crash,報(bào)出如下所示錯誤。 

Android中怎么實(shí)現(xiàn)一個沉浸式狀態(tài)欄

因此在使用Toolbar 的時候,我們需要style中添加如下屬性配置

true

當(dāng)然我們也可以通過代碼動態(tài)去掉title,但當(dāng)我們的主題從Theme.AppCompat作為父類繼承的時候,通過代碼并不可以去掉title。

自定義導(dǎo)航欄

Android中怎么實(shí)現(xiàn)一個沉浸式狀態(tài)欄

當(dāng)我們未設(shè)置windowNoTitle屬性的時候,在導(dǎo)航欄之上有title。顯然和我們要實(shí)現(xiàn)導(dǎo)航欄的沉浸式有所違背,因此實(shí)現(xiàn)對于導(dǎo)航欄的沉浸,

true該配置是必不可少的。

設(shè)置狀態(tài)欄透明

去掉title之后,是否我們就可以實(shí)現(xiàn)上述的效果了呢?

Android中怎么實(shí)現(xiàn)一個沉浸式狀態(tài)欄

這個時候,我們發(fā)現(xiàn)狀態(tài)欄還是黑色,并沒有沉浸,需要我們將狀態(tài)欄設(shè)置為透明。

true

該屬性只有在在4.4和高于4.4版本上可以進(jìn)行該屬性的配置,但是在更低版本上則無法使用。配置該屬性之后,執(zhí)行效果如下圖所示。

Android中怎么實(shí)現(xiàn)一個沉浸式狀態(tài)欄

解決導(dǎo)航欄上移問題

這個時候,Toolbar被整體上移了,導(dǎo)致其部分功能也進(jìn)入了狀態(tài)欄之下,包括導(dǎo)航欄的內(nèi)容也到了狀態(tài)欄位置之中,顯然這是不符合我們最初的要求的。如何解決這個問題?我們在Toolbar中添加fitSystemWindows屬性,即可使得toolbar的上部空出一個高度,使得Toolbar內(nèi)容部分脫離狀態(tài)欄。

    

得到我們最終想要得到的效果

Android中怎么實(shí)現(xiàn)一個沉浸式狀態(tài)欄

自定義導(dǎo)航欄與之實(shí)現(xiàn)類似。

fitsSystemWindows屬性

前面對Toolbar的設(shè)置是在Toolbar中添加的fitSystemWindows屬性,那么當(dāng)我們將其屬性添加到Toolbar所在的最外層的布局會怎么樣呢?

             

執(zhí)行之后,可以看到和之前未設(shè)置狀態(tài)欄透明時的效果相同。

Android中怎么實(shí)現(xiàn)一個沉浸式狀態(tài)欄

那么這個fitSystemWindows工作的原理是什么呢?通過上述實(shí)驗(yàn),不難發(fā)現(xiàn),對于沉浸狀態(tài)欄的控制,該屬性起到了一個很關(guān)鍵的作用。

接下來通過一個實(shí)驗(yàn)來驗(yàn)證下,該屬性所起的作用,在Toolbar所在的布局中,在布局的底部添加一個Button.

           

Android中怎么實(shí)現(xiàn)一個沉浸式狀態(tài)欄

當(dāng)我們將該屬性設(shè)置到按鈕上,又會發(fā)生什么呢?

Android中怎么實(shí)現(xiàn)一個沉浸式狀態(tài)欄

通過比較可以很明顯的看出,設(shè)置了fitsSystemWindows屬性的View在其上部被設(shè)置了一個padding。根據(jù)之前做的實(shí)驗(yàn),我們可以知道當(dāng)我們設(shè)置了窗口狀態(tài)欄透明之后,整個內(nèi)容視圖會向上移動了一個狀態(tài)欄的高度,而當(dāng)前為該View增加的padding的大小是不是和其高度相同呢?

Button btn = (Button) findViewById(R.id.test_btn);  Log.i("padding", btn.getPaddingTop()+"");  Rect frame = new Rect();  getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);  Log.i("height", frame.top+"");

獲取按鈕的padding高度和狀態(tài)欄的高度,我們可以得到如下日志。

Android中怎么實(shí)現(xiàn)一個沉浸式狀態(tài)欄

通過實(shí)驗(yàn)我們可以得出結(jié)論,fitSystemWindows屬性會對所設(shè)置的View增加一個top  padding,因此當(dāng)我們在實(shí)現(xiàn)讓導(dǎo)航欄沉浸的時候,設(shè)置窗口狀態(tài)欄的透明會使得視圖整體上移,而借助fitSystemWindows屬性的功能,為視圖中最頂部的View設(shè)置一個和狀態(tài)欄高度相同的padding,使得導(dǎo)航欄不會被頂?shù)綘顟B(tài)欄內(nèi)。

當(dāng)我們在一個視圖中,多個View設(shè)置該屬性時,發(fā)現(xiàn)只有***個設(shè)置該屬性的View會起作用,在視圖布局上,自上而下的***個View其作用。層級上則為最***的View上首先其作用。因此其功能歸納為:

  • 為設(shè)置該屬性的View增加一個和狀態(tài)欄高度相同的toppadding

  • 當(dāng)視圖中有多個View被設(shè)置了該屬性,那么只布局上最頂部的View起作用

5.0及其以上

至此,我們可以***的實(shí)現(xiàn)一個狀態(tài)欄的沉浸,上述的實(shí)現(xiàn)是在Android  4.4版本上,在視圖的最上部,會有一個黑色漸變的陰影,而在5.0設(shè)備上的展示效果如下所示,在狀態(tài)欄上整個都會有一個陰影。當(dāng)然不同廠家對此也有自己的一些優(yōu)化,比如魅族在4.4上是不具有陰影的。

Android中怎么實(shí)現(xiàn)一個沉浸式狀態(tài)欄

對于5.0及其之上,官方提供了對狀態(tài)欄顏色控制的相應(yīng)API,我們可以通過代碼來控制狀態(tài)欄的顏色,實(shí)現(xiàn)如下效果。

Android中怎么實(shí)現(xiàn)一個沉浸式狀態(tài)欄

實(shí)現(xiàn)代碼

if(Build.VERSION.SDK_INT >= 21) {             Window window = getWindow();             //取消設(shè)置透明狀態(tài)欄,使 ContentView 內(nèi)容不再沉浸到狀態(tài)欄下             window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);             //需要設(shè)置這個 flag 才能調(diào)用 setStatusBarColor 來設(shè)置狀態(tài)欄顏色             window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);             //設(shè)置狀態(tài)欄顏色             window.setStatusBarColor(getResources().getColor(R.color.yx_red));         }

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。


標(biāo)題名稱:Android中怎么實(shí)現(xiàn)一個沉浸式狀態(tài)欄
文章來源:http://weahome.cn/article/gcddhg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部