最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

react-native android狀態(tài)欄的實現(xiàn)

 更新時間:2018年06月15日 14:06:40   作者:Undo_03  
這篇文章主要介紹了react-native android狀態(tài)欄的實現(xiàn),使狀態(tài)欄顏色與App顏色一致,使用戶界面更加整體。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

react-native 開發(fā)App的時候難免會遇到狀態(tài)欄的,背景顏色和字體顏色與App內(nèi)容頁面,色調(diào)適配,間言之就是將狀態(tài)欄顏色與App顏色一致,使用戶界面更加整體。

1.android設備系統(tǒng)元素

  1. 導航欄:就是設備頂部的網(wǎng)絡、時間、電量等信息欄
  2. ActionBar: 返回按鈕以及系統(tǒng)默認的header區(qū)域,RN開發(fā)中一般不會用到,RN中在navigation中進行定制
  3. 導航欄: 設備下方的物理返回、回桌面、選擇應用程序等系統(tǒng)導航欄

2.狀態(tài)欄的呈現(xiàn)形式

  1. 默認展示,一直顯示手機系統(tǒng)的狀態(tài)欄
  2. 透明狀態(tài)欄,狀態(tài)欄背景顏色透明,狀態(tài)欄顏色與App顏色一致,用戶界面更加整體。
  3. 隱藏狀態(tài)欄(沉浸式),狀態(tài)欄完全隱藏,類似于全屏游戲、視頻播放器的效果

2.1 默認展示

系統(tǒng)默認狀態(tài)欄樣式,無法改變

2.2 透明狀態(tài)欄

透明狀態(tài)欄很常見,大多數(shù)的App都是使用這種模式,使得狀態(tài)欄顏色與App顏色一致,使用戶界面更加整體,整個應用看起來更加美觀。

實現(xiàn)透明的狀態(tài)欄的方式很多:

一、使用App的主題進行配置,在app/main/res/values/styles.xml中設置主題

<resources>

 <!-- Base application theme. -->
 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="android:windowTranslucentStatus">true</item> // 設置狀態(tài)欄不占據(jù)空間
  // <item name="android:windowLightStatusBar">true</item> // 設置狀態(tài)欄字體顏色
 </style>

</resources>

這種方式支持api19, 即Android4.4及以上,會在App啟動的時候就生效, 在App啟動時有權(quán)限確認、系統(tǒng)彈窗等也不受影響,在彈出modal之類的深色蒙層時狀態(tài)欄字體會變成成淺色

只設置 <item name="android:windowTranslucentStatus">true</item> 這種方式設置的透明狀態(tài)欄,狀態(tài)欄字體默認白色,無法再動態(tài)通過StatusBar改變狀態(tài)欄的背景顏色,在做需要改變狀態(tài)欄背景顏色的時候就比較尷尬了

再加一個 <item name="android:windowLightStatusBar">true</item> 這樣設置狀態(tài)欄字體顏色之后,在深色modal彈出的時候字體不會動態(tài)改變成白色,但可以通過StatusBar設置barStyle來改變,實際上也不是很方便

二、android原生設置,在MainActivity的onCreate中進行設置

protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 // 設置透明狀態(tài)欄
 if (Build.VERSION.SDK_INT >= 21) {
  View decorView = getWindow().getDecorView();
  int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
  decorView.setSystemUiVisibility(option);
  getWindow().setStatusBarColor(Color.TRANSPARENT);
 }
 
 // 設置透明狀態(tài)欄和透明導航欄
 if (Build.VERSION.SDK_INT >= 21) {
  View decorView = getWindow().getDecorView();
  int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
  decorView.setSystemUiVisibility(option);
  getWindow().setNavigationBarColor(Color.TRANSPARENT);
  getWindow().setStatusBarColor(Color.TRANSPARENT);
 }
}

透明式狀態(tài)欄,只有5.0及以上系統(tǒng)才支持,因此這里先進行了一層if判斷,只有系統(tǒng)版本大于或等于5.0的時候才會執(zhí)行下面的代碼。 接下來我們使用了 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN SYSTEM_UI_FLAG_LAYOUT_STABLE ,注意兩個Flag必須要結(jié)合在一起使用,表示會讓應用的主體內(nèi)容占用系統(tǒng)狀態(tài)欄的空間,也就是說狀態(tài)欄不再占據(jù)空間。最后再調(diào)用Window的setStatusBarColor()方法將狀態(tài)欄設置成透明色就可以了。

三、使用RN的StatusBar來設置,在App首次加載的頁面中對狀態(tài)欄進行設置

<StatusBar backgroundColor='transparent' translucent barStyle={'dark-content'} />

這種方式,會在App剛啟動的時候和App啟動時有權(quán)限確認、系統(tǒng)彈窗等會先試用系統(tǒng)的默認狀態(tài)欄,加載App頁面之后再改變成上面設置的樣式。 好處在于可以動態(tài)進行設置狀態(tài)欄的樣式。

StatusBar屬性簡介:

  1. animated: bool 指定狀態(tài)欄的變化是否應以動畫形式呈現(xiàn)。目前支持這幾種樣式:backgroundColor, barStyle和hidden
  2. hidden: bool 是否隱藏狀態(tài)欄。
  3. backgroundColor: 狀態(tài)欄的背景色。
  4. translucent: bool 指定狀態(tài)欄是否透明。設置為true時,應用會在狀態(tài)欄之下繪制(即所謂“沉浸式”——被狀態(tài)欄遮住一部分)。常和帶有半透明背景色的狀態(tài)欄搭配使用。
  5. barStyle: enum('default', 'light-content', 'dark-content') 設置狀態(tài)欄文本的顏色。

以上幾種方式都會有一個問題,狀態(tài)欄不再占據(jù)空間,因此在頁面布局的時候需要加 paddingTop 值為狀態(tài)欄的高度。

純前端就可以實現(xiàn),這也是適配目前主流劉海屏的一種方式,利用StatusBar.currentHeight可以獲取到設備狀態(tài)欄的高度。

2.3 隱藏 狀態(tài)欄 和 導航欄

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(option);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();

3. 淺色狀態(tài)欄的兼容性配置

目前市面上的淺色狀態(tài)欄基本都是 白底黑字, 支持這種設置的有Android6.0及其以上; MIUI v6及以上, Flyme 4.0及以上

具體兼容方案如下:

Flyme 4.0及以上

public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) {
 boolean result = false;
 if (window != null) {
  try {
   WindowManager.LayoutParams lp = window.getAttributes();
   Field darkFlag = WindowManager.LayoutParams.class
     .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
   Field meizuFlags = WindowManager.LayoutParams.class
     .getDeclaredField("meizuFlags");
   darkFlag.setAccessible(true);
   meizuFlags.setAccessible(true);
   int bit = darkFlag.getInt(null);
   int value = meizuFlags.getInt(lp);
   if (dark) {
    value |= bit;
   } else {
    value &= ~bit;
   }
   meizuFlags.setInt(lp, value);
   window.setAttributes(lp);
   result = true;
  } catch (Exception e) {

  }
 }
 return result;
}

Android6.0及以上

public static void setAndroidNativeLightStatusBar(Activity activity, boolean dark) {
 //狀態(tài)欄字體圖標顏色
 View decor = activity.getWindow().getDecorView();
 if (dark) {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
   decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR //淺色狀態(tài)欄(字體圖標白色)
     | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN //contentView 全屏(置于statusbar之下)
     | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
  }
 } else {
  decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
 }
}

MIUI v6及以上

public static boolean MIUISetStatusBarLightMode(Activity activity, boolean dark) {
 if(Build.VERSION.SDK_INT >= 24){
  return false;
 }
 boolean result = false;
 Window window=activity.getWindow();
 if (window != null) {
  Class clazz = window.getClass();
  try {
   int darkModeFlag = 0;
   Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
   Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
   darkModeFlag = field.getInt(layoutParams);
   Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
   if(dark){
    extraFlagField.invoke(window,darkModeFlag,darkModeFlag);//狀態(tài)欄透明且黑色字體
   }else{
    extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字體
   }
   result=true;

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    //開發(fā)版 7.7.13 及以后版本采用了系統(tǒng)API,舊方法無效但不會報錯,所以兩個方式都要加上
    if(dark){
     activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    }else {
     activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
    }
   }
  }catch (Exception e){

  }
 }
 return result;
}

在MainActivity的onCreate中調(diào)用

LightStatusBarUtil.FlymeSetStatusBarLightMode(this.getWindow(), false);
LightStatusBarUtil.MIUISetStatusBarLightMode(this, false); 
LightStatusBarUtil.setAndroidNativeLightStatusBar(this, true);

總結(jié)

實現(xiàn)透明狀態(tài)欄,以上方案都沒有完全兼容android 4.4以下版本,個人覺得比較合適的做法是 android設置透明狀態(tài)欄 + 淺色狀態(tài)欄的兼容性配置 + StatusBar 來配合控制

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • react?card?slider實現(xiàn)滑動卡片教程示例

    react?card?slider實現(xiàn)滑動卡片教程示例

    這篇文章主要為大家介紹了react?card?slider實現(xiàn)滑動卡片教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • JavaScript的React Web庫的理念剖析及基礎(chǔ)上手指南

    JavaScript的React Web庫的理念剖析及基礎(chǔ)上手指南

    這篇文章主要介紹了JavaScript的React Web庫的理念剖析及基礎(chǔ)上手指南,React Web的目的即是把本地的React Native應用程序項目變?yōu)閃eb應用程序,需要的朋友可以參考下
    2016-05-05
  • React Native 通告消息豎向輪播組件的封裝

    React Native 通告消息豎向輪播組件的封裝

    這篇文章主要介紹了React Native 通告消息豎向輪播組件的封裝,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • react高階組件添加和刪除props

    react高階組件添加和刪除props

    這篇文章主要介紹了react高階組件添加和刪除props,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • React開啟代理的2種實用方式

    React開啟代理的2種實用方式

    最近有不少伙伴詢問react的代理配置,自己也去試驗了一下發(fā)現(xiàn)不少的問題,在這就將所遇到的心得分享出來,這篇文章主要給大家介紹了關(guān)于React開啟代理的2種實用方式的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • 解決antd的Table組件使用rowSelection屬性實現(xiàn)多選時遇到的bug

    解決antd的Table組件使用rowSelection屬性實現(xiàn)多選時遇到的bug

    這篇文章主要介紹了解決antd的Table組件使用rowSelection屬性實現(xiàn)多選時遇到的bug問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • React中react-redux和路由詳解

    React中react-redux和路由詳解

    這篇文章主要介紹了React中react-redux和路由詳解,redux早期被設計成可以在各個框架中使用,因此在不同的框架中使用的時候,要引入相應的插件,感興趣的朋友可以繼續(xù)學習下面文章
    2022-08-08
  • React路由跳轉(zhuǎn)的實現(xiàn)示例

    React路由跳轉(zhuǎn)的實現(xiàn)示例

    在React中,可以使用多種方法進行路由跳轉(zhuǎn),本文主要介紹了React路由跳轉(zhuǎn)的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • React項目使用ES6解決方案及JSX使用示例詳解

    React項目使用ES6解決方案及JSX使用示例詳解

    這篇文章主要為大家介紹了React項目使用ES6解決方案及JSX使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 詳解React項目的服務端渲染改造(koa2+webpack3.11)

    詳解React項目的服務端渲染改造(koa2+webpack3.11)

    本篇文章主要介紹了詳解React項目的服務端渲染改造(koa2+webpack3.11),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03

最新評論

泗水县| 兴隆县| 阿图什市| 永泰县| 通化市| 乌鲁木齐县| 南平市| 六盘水市| 会同县| 四会市| 阜康市| 延吉市| 徐州市| 郎溪县| 扶绥县| 德钦县| 沂水县| 商城县| 稷山县| 普洱| 留坝县| 广西| 莱芜市| 西青区| 南和县| 玛纳斯县| 高州市| 江陵县| 城口县| 兴文县| 金山区| 都昌县| 宜昌市| 尼木县| 开封市| 城固县| 大兴区| 深泽县| 蒙自县| 青神县| 侯马市|