国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Android沉浸式狀態欄實現

移動開發 Android
應用市場上App越來越多的出現沉浸式狀態欄的設計(如下圖所示)狀態欄和導航欄具有相同的顏色。Android在4.4開始對于該種效果的支持,而在4.4之下,狀態欄只是黑框,無法控制。同時在4.4和5.0及其之上的版本對該種效果的支持又有所差異,因此要實現該種效果,可以將4.4歸為一類,5.0及其之上歸為一類。

應用市場上App越來越多的出現沉浸式狀態欄的設計(如下圖所示)狀態欄和導航欄具有相同的顏色。Android在4.4開始對于該種效果的支持,而在4.4之下,狀態欄只是黑框,無法控制。同時在4.4和5.0及其之上的版本對該種效果的支持又有所差異,因此要實現該種效果,可以將4.4歸為一類,5.0及其之上歸為一類。接下來,我們將一步步來在4.4和5.0及其之上來實現如下所示效果。 

 

 

 

導航欄問題

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

去掉Title

  • Toolbar默認主題會具有一個title,當我們使用Toolbar的時候,而沒有去掉title,應用則會crash,報出如下所示錯誤。 

 

 

 

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

  1. <item name="windowNoTitle">true</item> 

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

自定義導航欄 

 

 

 

當我們未設置windowNoTitle屬性的時候,在導航欄之上有title。顯然和我們要實現導航欄的沉浸式有所違背,因此實現對于導航欄的沉浸,

<item name="windowNoTitle">true</item>該配置是必不可少的。

設置狀態欄透明

去掉title之后,是否我們就可以實現上述的效果了呢? 

 

 

 

這個時候,我們發現狀態欄還是黑色,并沒有沉浸,需要我們將狀態欄設置為透明。

  1. <item name="android:windowTranslucentStatus">true</item> 

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

 

 

 

解決導航欄上移問題

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

  1. <android.support.v7.widget.Toolbar 
  2.        android:id="@+id/toolbar" 
  3.        android:fitsSystemWindows="true" 
  4.        android:layout_width="match_parent" 
  5.        android:layout_height="wrap_content"
  6.    </android.support.v7.widget.Toolbar>  

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

 

 

 

自定義導航欄與之實現類似。

fitsSystemWindows屬性

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

  1. <RelativeLayout 
  2.     xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     xmlns:tools="http://schemas.android.com/tools" 
  4.     android:id="@+id/activity_toolbar" 
  5.     android:layout_width="match_parent" 
  6.     android:layout_height="match_parent" 
  7.     android:fitsSystemWindows="true" 
  8. tools:context="com.example.netease.toolbardemo.activity.ToolbarActivity"
  9.  
  10.     <android.support.v7.widget.Toolbar 
  11.         android:id="@+id/toolbar" 
  12.         android:layout_width="match_parent" 
  13.         android:layout_height="wrap_content"
  14.     </android.support.v7.widget.Toolbar> 
  15.  
  16. </RelativeLayout>  

執行之后,可以看到和之前未設置狀態欄透明時的效果相同。 

 

 

 

那么這個fitSystemWindows工作的原理是什么呢?通過上述實驗,不難發現,對于沉浸狀態欄的控制,該屬性起到了一個很關鍵的作用。

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

  1. <android.support.v7.widget.Toolbar 
  2.         android:id="@+id/toolbar" 
  3.         android:fitsSystemWindows="true" 
  4.         android:layout_width="match_parent" 
  5.         android:layout_height="wrap_content"
  6.     </android.support.v7.widget.Toolbar> 
  7.  
  8.     <Button 
  9.         android:text="Test" 
  10.         android:layout_width="match_parent" 
  11.         android:layout_height="wrap_content" 
  12.         android:background="@color/colorAccent" 
  13.         android:layout_alignParentBottom="true"/>   

 

 

 

當我們將該屬性設置到按鈕上,又會發生什么呢?

  1. <Button 
  2.        android:text="Test" 
  3.        android:fitsSystemWindows="true" 
  4.        android:layout_width="match_parent" 
  5.        android:layout_height="wrap_content" 
  6.        android:background="@color/colorAccent" 
  7.        android:layout_alignParentBottom="true"/>  

 

 

 

 

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

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

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

 

 

 

通過實驗我們可以得出結論,fitSystemWindows屬性會對所設置的View增加一個top padding,因此當我們在實現讓導航欄沉浸的時候,設置窗口狀態欄的透明會使得視圖整體上移,而借助fitSystemWindows屬性的功能,為視圖中最頂部的View設置一個和狀態欄高度相同的padding,使得導航欄不會被頂到狀態欄內。

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

  • 為設置該屬性的View增加一個和狀態欄高度相同的toppadding
  • 當視圖中有多個View被設置了該屬性,那么只布局上最頂部的View起作用

5.0及其以上

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

 

 

 

對于5.0及其之上,官方提供了對狀態欄顏色控制的相應API,我們可以通過代碼來控制狀態欄的顏色,實現如下效果。 

 

 

 

實現代碼

  1. if(Build.VERSION.SDK_INT >= 21) { 
  2.             Window window = getWindow(); 
  3.             //取消設置透明狀態欄,使 ContentView 內容不再沉浸到狀態欄下 
  4.             window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 
  5.             //需要設置這個 flag 才能調用 setStatusBarColor 來設置狀態欄顏色 
  6.             window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
  7.             //設置狀態欄顏色 
  8.             window.setStatusBarColor(getResources().getColor(R.color.yx_red)); 
  9.         }  

據此可以看出,當我們在5.0及其之上的實現中,可以不用進行狀態欄透明的設置和fitSystemWindows屬性的設置,直接通過代碼來控制,但為了適應4.4版本,建議在代碼中仍然按之前的方式實現,如果想在5.0及其高版本中實現去陰影,再手動在代碼中控制。 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2016-11-29 11:20:08

Android

2017-12-05 12:44:57

Android沉浸式狀態欄APP

2021-08-09 20:29:27

Android沉浸式狀態欄

2022-11-23 14:47:29

北向開發鴻蒙

2014-06-06 14:03:13

iOS狀態欄提示控件原理

2013-07-18 16:09:10

自定義iOS狀態欄iOS開發iOS學習

2022-02-22 09:16:41

AndroidWindows狀態欄

2012-12-24 14:42:48

iOS自定義狀態欄

2015-02-12 14:49:36

CGToast狀態欄提示Status

2021-06-15 15:04:38

Android 12安卓通話

2013-11-20 15:08:32

iOS開發狀態欄

2021-06-15 15:28:31

谷歌Android開發

2018-05-16 09:11:19

Android狀態欄移動系統

2016-11-18 08:41:23

2022-03-16 15:30:25

barAndroid開發者

2011-06-16 11:15:04

2023-05-30 14:50:20

界面開發鴻蒙

2021-10-20 07:39:12

谷歌安卓 Android 12

2020-11-23 14:29:22

Android 10窗口代碼

2023-07-12 23:27:24

Powerline編輯器
點贊
收藏

51CTO技術棧公眾號

亚洲综合网狠久久| 欧美日韩看看2015永久免费| 日本一区二区三区在线播放| 91亚洲精品久久久蜜桃| 性直播体位视频在线观看| 欧美精品欧美精品| 久久国产精品久久久久久| 中文字幕成人网| 夜间精品视频| 最新亚洲人成网站在线观看| 久久久久久国产精品美女| av毛片久久久久**hd| 久草在线视频福利| 日本10禁啪啪无遮挡免费一区二区| 一区二区三区av电影| 精品淫伦v久久水蜜桃| www黄色日本| 久久久久久国产精品美女| 成人av电影在线网| a一区二区三区亚洲| 91九色露脸| 中文字幕一区二区三区色视频| 日本道免费精品一区二区三区| 无人区在线高清完整免费版 一区二| 国产成人精品综合| 波多野结衣亚洲一区| 国产激情在线观看| 国产精品久久久久秋霞鲁丝| 成人激情小说网站| 日本大片在线播放| 91视频在线免费观看| 国产精品美女久久久久高潮| 欧美专区福利免费| 欧美第一黄网| 黑人精品xxx一区一二区| 粉嫩av一区二区| 国产精品videossex国产高清| 欧美日韩高清一区| 欧美女王vk| 天天干天天干天天干天天干天天干| 亚洲精品国产精品久久清纯直播| 欧美黄色一区二区| 国产精品久久久久白浆| 欧美激情亚洲激情| 成人午夜电影网站| 欧美xxxhd| 日韩hmxxxx| 日韩一区二区三区在线观看| 国产一区二区中文| 欧美日韩伦理片| 国产精品国语对白| 亚洲精品乱码久久久久久久久| 91精品国产自产精品男人的天堂 | av网站无病毒在线| 成年人羞羞的网站| 国产精品入口日韩视频大尺度| 成人美女在线视频| 无码少妇一区二区三区芒果| 国产伦精品一区二区三区视频黑人 | 成人片在线免费看| 午夜精品久久久久| 国产中文精品久高清在线不| 69国产精品| 国产成人精品亚洲精品| 亚洲欧美日韩国产手机在线| 天堂在线精品| 日本女优北野望在线电影| 国产成人久久精品| 国产精品粉嫩av| 日韩一区免费观看| 久久中文字幕国产| 国内精品国产三级国产a久久| 99re在线视频| 日韩欧美亚洲范冰冰与中字| 精品国内自产拍在线观看视频| 一区中文字幕| 国产资源第一页| 亚洲九九九在线观看| 久久国产精品色| 日本精品一区二区三区在线播放| 亚洲欧美综合精品久久成人| 奇米一区二区三区| 国产香蕉视频在线观看| 亚洲成人久久久久| 99亚洲视频| siro系绝美精品系列| 中文字幕国产精品| 久色婷婷小香蕉久久| 91国内精品在线视频| 欧美国产极速在线| 精品福利樱桃av导航| 91精品国产色综合久久不卡粉嫩| 蜜桃91精品入口| 亚洲高清免费在线| 成人香蕉社区| 成人免费在线观看| 日本www在线播放| 日韩免费不卡av| 欧美一级理论片| 国产精品亚洲а∨天堂免在线| 图片一区二区| 九色在线视频蝌蚪| 国产精品视频地址| 久久亚洲捆绑美女| 波多野结衣在线观看一区二区三区| 狠狠干婷婷色| 欧美18视频| 国产成人一区二| 免费97视频在线精品国自产拍| 欧美亚洲动漫精品| 91电影在线观看| 免费在线稳定资源站| 国产成人精品三级| 91精品短视频| 久草视频在线看| 一本色道久久88精品综合| 国产免费人做人爱午夜视频| 欧美一区二区.| 欧美视频在线不卡| 国产综合久久久久久鬼色| 亚洲2区在线| 全色精品综合影院| 日韩一二区视频| 国产精品久久久久aaaa九色| 日韩欧美国产一区二区三区| 久久精品男人天堂av| 影视一区二区| 日韩三级成人| av大片在线播放| 杨幂毛片午夜性生毛片| 欧美日韩电影一区二区| 久久97久久97精品免视看| 91黄色免费版| 国产亚洲精品bt天堂精选| aa国产精品| 欧美一性一交| 日本黄色免费在线| 欧美另类极限扩张| 免费看毛片的网址| 国产一区免费观看| 91po在线观看91精品国产性色| 欧美变态tickle挠乳网站| 玉足女爽爽91| 成人午夜视频福利| 在线不卡视频| 国产96在线亚洲| 国产污视频在线播放| 在线观看入口黄最新永久免费国产 | 国产美女在线一区| 国产伦精品一区二区三区照片91| 久久99视频精品| 日韩成人激情视频| 欧美亚洲综合色| 亚洲视频在线观看三级| 国产一区二区三区日韩| 91久久午夜| 日韩精品1区| jizz性欧美23| 日韩精品免费观看视频| 1区2区在线观看| 激情在线视频| 香蕉视频在线观看网站| 色成人亚洲网| 不卡影院一区二区| 亚洲小视频在线播放| 麻豆av一区二区三区| 成人综合网网址| 国产成人精品免高潮费视频| 欧美华人在线视频| 亚洲午夜国产成人av电影男同| 日韩一区二区中文字幕| 精品电影在线观看| 伊人夜夜躁av伊人久久| 国产精品久久久久久久久久免费看| 国产一区久久久| 精品在线一区二区三区| 日韩激情视频网站| 亚洲免费影视| 欧美精品三级| 五月天久久久| 久久在线播放| 成人在线免费观看视频| 久久99精品国产自在现线| 欧美9999| 91九色单男在线观看| 欧日韩在线观看| 国内揄拍国内精品| 欧美大片第1页| 久久精品91久久香蕉加勒比| 亚洲欧美中文日韩在线| 亚洲精品少妇网址| 一区二区欧美激情| 久久久999国产精品| 欧美成人一二三| 高清欧美性猛交| 午夜欧美在线一二页| 日韩免费在线观看视频| 亚洲欧美视频一区二区| 久久福利视频一区二区| 亚洲一级黄色片|