Android 沉浸式狀態(tài)欄學(xué)習(xí)記錄

Android使用沉浸式狀態(tài)欄會(huì)讓你的app看起來(lái)更加高大上司光,但是會(huì)產(chǎn)生很多兼容問(wèn)題此衅,一個(gè)app的activity肯定不止一個(gè)强戴,有的時(shí)候,需要漸變的toolbar挡鞍,有的時(shí)候骑歹,有需要DrawerLayout等布局,那沉浸式布局又會(huì)給你帶來(lái)許多麻煩

下面是我認(rèn)為沉浸式布局最好的定制方案了墨微,因?yàn)閍pp的每個(gè)activity都要實(shí)現(xiàn)沉浸式道媚,所以我建議你可以寫個(gè)BaseActivity讓所有的activity繼承他,這樣我們可以在里面做很多activity共同的事翘县,首先是xml文件的代碼:

<android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:elevation="0dp"
        android:background="@null"
        app:theme="@style/toolbar_dark_theme">

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:background="@mipmap/toolbar_detail"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:titleTextColor="@color/colorAccent" />

            <View android:id="@+id/bar_top"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:visibility="gone"
                android:background="#20000000"></View>

        </FrameLayout>

    </android.support.design.widget.AppBarLayout>

跟大家常見(jiàn)的布局并沒(méi)有什么不同
就是在toolbar的外面套了一個(gè)FrameLayout布局最域,并添加了一個(gè)View(這個(gè)view就是狀態(tài)欄的底色)
因?yàn)橛袝r(shí)候,你的toolbar可能是白色的锈麸,你的狀態(tài)欄上面的圖標(biāo)字體可能也是白色的镀脂,會(huì)看不見(jiàn),你可設(shè)置#20000000半透明的灰色,比較接近google默認(rèn)的底色
至于AppBarLayout 的 app:theme="@style/toolbar_dark_theme 則是自定義的them,在style文件中加入

<!--toolbar 的樣式 start-->
    <style name="toolbar_dark_theme" parent="ThemeOverlay.AppCompat.Light">
        <item name="colorButtonNormal">@android:color/white</item>
        <!--toolbar 圖標(biāo)的顏色掐隐,包括返回鍵狗热,菜單的點(diǎn)-->
        <item name="colorControlNormal">@android:color/holo_red_light</item>
        <!--toolbar 側(cè)滑菜單的顏色-->
        <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
        <!--toolbar 菜單顯示的文字顏色-->
        <item name="actionMenuTextColor">@android:color/holo_green_dark</item>
        <item name="android:textColor">@android:color/holo_red_light</item>
        <item name="android:textSize">13sp</item> <!--  菜單文字字體大小-->
        <!--三個(gè)點(diǎn)展開內(nèi)容的設(shè)置-->
        <item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
        <!--三個(gè)點(diǎn)  圖標(biāo)片的替換-->
        <item name="android:actionOverflowButtonStyle">@style/ToolbarOverflow</item>
    </style>

    <style name="ToolbarOverflow" parent="@android:style/Widget.ActionButton.Overflow">
        <item name="android:src">@drawable/ic_menu</item>
    </style>

 <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
        <item name="spinBars">true</item>
        <item name="color">@android:color/holo_green_dark</item>
    </style>

    <style name="OverflowMenuStyle" parent="@style/Widget.AppCompat.PopupMenu.Overflow">
        <!-- 是否覆蓋錨點(diǎn),默認(rèn)為true虑省,即蓋住Toolbar -->
        <item name="overlapAnchor">false</item>
        <!-- 彈出層背景顏色 -->
        <item name="android:popupBackground">@android:color/holo_green_dark</item>
        <!-- 彈出層垂直方向上的偏移匿刮,即在豎直方向上距離Toolbar的距離,值為負(fù)則會(huì)蓋住Toolbar -->
        <item name="android:dropDownVerticalOffset">5dp</item>
        <!-- 彈出層水平方向上的偏移探颈,即距離屏幕左邊的距離熟丸,負(fù)值會(huì)導(dǎo)致右邊出現(xiàn)空隙 -->
        <item name="android:dropDownHorizontalOffset">-1dp</item>
    </style>
    <!--toolbar 的樣式 end-->

接下來(lái)就是在activity的應(yīng)用了:

   /**
    * 設(shè)置toolbar沉浸到任務(wù)欄
    * @param toolbar
    * 設(shè)置狀態(tài)欄的底色
    * @param top_color
    */
   public void SetToolbar(Toolbar toolbar,int top_color){
       setSupportActionBar(toolbar);
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
           Window window = getWindow();
           window.clearFlags(
                   WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                           | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
           window.getDecorView().setSystemUiVisibility(
                   View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                           | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
           window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
           window.setStatusBarColor(ContextCompat.getColor(this,top_color));
           window.setNavigationBarColor(Color.BLACK);
       } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
           Window window = getWindow();
           window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                   WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
       }
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
           if (Build.VERSION_CODES.LOLLIPOP>Build.VERSION.SDK_INT) {
               View paddingView = findViewById(R.id.bar_top);
               paddingView.setVisibility(View.VISIBLE);
               ViewGroup.LayoutParams params = paddingView.getLayoutParams();
               params.height = getStatusBarHeight();
           }
           toolbar.setFitsSystemWindows(true);
           toolbar.getLayoutParams().height = getAppBarHeight();
           toolbar.setPadding(toolbar.getPaddingLeft(),
                   getStatusBarHeight(),
                   toolbar.getPaddingRight(),
                   toolbar.getPaddingBottom());
       }
   }


private int getAppBarHeight() {
       return dip2px(56) + getStatusBarHeight();
   }

   private int getStatusBarHeight() {
       int result = 0;
       int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
       if (resourceId > 0) {
           result = getResources().getDimensionPixelSize(resourceId);
       }
       return result;
   }

   private int dip2px(float dipValue) {
       final float scale = getResources().getDisplayMetrics().density;
       return (int) (dipValue * scale + 0.5f);
   }

解釋一下上面代碼的意義
根據(jù)不同的系統(tǒng)版本,我們可以做的處理也是不一樣的伪节,Android 4.4 - Android 5.0 的Android 版本中并沒(méi)有以下方法光羞,所以沒(méi)辦法設(shè)置狀態(tài)欄和低欄的底色

        window.setStatusBarColor(ContextCompat.getColor(this,top_color));
        window.setNavigationBarColor(ContextCompat.getColor(this,navigation_color));

但是我們可以自定義布局以及顏色:
1.先設(shè)置充滿狀態(tài)欄

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window window = getWindow();
            window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }

2.自定義一個(gè)狀態(tài)欄的布局绩鸣,并設(shè)置他的底色:

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            if (Build.VERSION_CODES.LOLLIPOP>Build.VERSION.SDK_INT) {
                View paddingView = findViewById(R.id.bar_top);
                paddingView.setVisibility(View.VISIBLE);
                ViewGroup.LayoutParams params = paddingView.getLayoutParams();
                params.height = getStatusBarHeight();
            }
            toolbar.setFitsSystemWindows(true);
            toolbar.getLayoutParams().height = getAppBarHeight();
            toolbar.setPadding(toolbar.getPaddingLeft(),
                    getStatusBarHeight(),
                    toolbar.getPaddingRight(),
                    toolbar.getPaddingBottom());
        }

3.補(bǔ)充一點(diǎn),如果你發(fā)現(xiàn)狀態(tài)欄的顏色依舊是原來(lái)的顏色纱兑,那就是說(shuō)你在布局文件中設(shè)置了呀闻,刪除就可以了

android:fitsSystemWindows="true"

至于5.0以上的沉浸式,Window類已經(jīng)可以設(shè)置了潜慎,只要代碼中加入以下代碼就可以:

Window window = getWindow();
            window.clearFlags(
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                            | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            window.getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(ContextCompat.getColor(this,top_color));
            window.setNavigationBarColor(Color.BLACK);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捡多,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子铐炫,更是在濱河造成了極大的恐慌垒手,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倒信,死亡現(xiàn)場(chǎng)離奇詭異科贬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鳖悠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門榜掌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人乘综,你說(shuō)我怎么就攤上這事唐责。” “怎么了瘾带?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵鼠哥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我看政,道長(zhǎng)朴恳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任允蚣,我火速辦了婚禮于颖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嚷兔。我一直安慰自己森渐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布冒晰。 她就那樣靜靜地躺著同衣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壶运。 梳的紋絲不亂的頭發(fā)上耐齐,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼埠况。 笑死耸携,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辕翰。 我是一名探鬼主播夺衍,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼喜命!你這毒婦竟也來(lái)了刷后?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤渊抄,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后丧裁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體护桦,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年煎娇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了二庵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缓呛,死狀恐怖催享,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哟绊,我是刑警寧澤因妙,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站票髓,受9級(jí)特大地震影響攀涵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洽沟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一以故、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裆操,春花似錦怒详、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至缎岗,卻和暖如春善玫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工茅郎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜗元,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓系冗,卻偏偏與公主長(zhǎng)得像奕扣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掌敬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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