FlexboxLayout幫助您完成聰明的UI佈局
去年我們在 Google I/O 上釋出了 ConstraintLayout,使得您在構建複雜佈局的同時能夠讓檢視層級得到精簡。它在 Android Studio 的 Visual Layout Editor 中也同樣可以使用。
與此同時,我們開源了 FlexboxLayout,使得 Android 裡的 CSS Flexible Layout 模組也能擁有同樣強大的功能。下面我們介紹幾個例子來說明一下 FlexboxLayout 的得力之處。FlexboxLayout 可以理解為高階的 LinearLayout ,因為這兩個佈局都將其子檢視按序排列。二者之間的重要差異在於 FlexboxLayout 具有 “換行” 的特性。
這意味著,如果您加入 flexWrap=“wrap" 屬性,且當前行中剩餘空間不夠的話,FlexboxLayout 就會將檢視放進新行中,如下圖所示:
一種佈局適配各種螢幕尺寸
鑑於這一特性,讓我們想象一個場景:您想要按序放置檢視,但當可用空間改變時(由於不同的裝置、螢幕方向更改或由於進入多視窗模式導致的介面重繪等因素),便不得不把它們移動到新行。
△ Nexus 5X 裝置:縱向檢視
△ Nexus 5X 裝置:橫向檢視
△ Pixel C 裝置:多視窗模式,分隔線在左邊
△ Pixel C 裝置:多視窗模式,分隔線在中間
△ Pixel C 裝置:多視窗模式,分隔線在右邊
如果您使用傳統的 LinearLayout 或 RelativeLayout 等佈局方式,需要定義多個 DP-bucket 佈局(例如 layout-600dp,layout-720dp,layout-1020dp)來處理各種螢幕尺寸。但上面的對話方塊只使用了一個 FlexboxLayout 就實現了。
這個示例使用了上面提到的 flexWrap=“wrap" 屬性:
這樣子檢視會自動換到新行,而不會從父級容器中溢位,如下圖所示:
另外一個需要強調的做法就是將 layout_flexGrow 屬性設定到一個獨立的子項上。這有助於在有可用空間剩餘時優化最終佈局的觀感。layout_flexGrow 屬性的運作原理類似於 LinearLayout 中的 layout_weight 屬性。這意味著 FlexboxLayout 將根據 layout_flexGrow 設定的值,為同一行中的每個子項分配剩餘空間 。
在下面的示例中,它假設每個子項的 layout_flexGrow 屬性的值設為 1,那麼剩餘空間將均勻分配到每個子項。
與 RecyclerView 結合使用
FlexboxLayout 的另一個優點是,它可以與 RecyclerView 結合使用。隨著最新 alpha 版的釋出,新版 Flexbox 佈局管理器對 RecyclerView 佈局管理器進行了擴充套件,現在您可以用更高效利用記憶體的方式,在可滾動容器中使用 Flexbox 的功能。
請注意,您現在仍然可以使用 ScrollView 結合 FlexboxLayout 的方式在可滾動容器中實現 flexbox 功能。但是,如果佈局中包含的專案數量過大,您可能會遭遇一些故障,甚至出現記憶體不足的情況。因為 FlexboxLayout 在使用者進行滾動操作導致檢視被移出螢幕時不會考慮到檢視迴圈。
一個真實的案例,與 RecyclerView 結合使用對於 Google Photos 、News 這些應用來說十分重要,因為它們都需要處理大量專案,並且專案的種類非常繁多。
在 FlexboxLayout 儲存庫裡有這麼一個示例,RecyclerView 中顯示的每個影象的寬度都不相同,但是通過將 flexWrap 配置設定為 wrap:
並將每個子項的 flexGrow 設為正值:(如您所見,您可以通過 Flexbox佈局管理器 和 Flexbox 佈局管理器的 LayoutParams 為子項配置屬性,而非從 xml 配置它)
△ 然後,您便可以看到,無論螢幕方向如何變化,每個影象都恰到好處地鑲嵌在佈局內。
想親自動手試試?
您可以馬上點選 “閱讀原文” 檢視有關其他屬性的完整文件,以根據您的需要構建靈活的佈局。我們非常樂意聽取您的反饋,如果您發現任何問題或想要我們實現一些新功能,歡迎您隨時在 GitHub 上向我們提出來。
推薦閱讀:
3.17 Google Doodle: 2017 年聖帕特里克節
相關文章
- android --巧用 flexboxLayout 佈局AndroidFlex
- Android FlexboxLayout 佈局詳解AndroidFlex
- Android隨筆——搞定流動佈局(FlexboxLayout)AndroidFlex
- Android可伸縮佈局-FlexboxLayout(支援RecyclerView整合)AndroidFlexView
- 平安智慧城市胡瑋:佈局1+N平臺讓城市更聰明
- HarmonyOS Java UI之DirectionalLayout佈局JavaUI
- Android入門教程 | UI佈局之RelativeLayout 相對佈局AndroidUI
- SAP UI5 Master-Detail 佈局模式的聯動效果實現明細介紹UIASTAI模式
- Android入門教程 | UI佈局之LinearLayout 線性佈局AndroidUI
- 手機app開發UI佈局的影響APPUI
- 重繪佈局等方法使用說明
- 幫助AdMob團隊,也就是幫助您自己
- me 2020 大師版Media Encoder 2020 幫助您更好的完成工作
- SAP UI5 SimpleForm 的 two-column layout 佈局UIORM
- 「遊戲誤國」已經過時了,父母現在要做的是幫孩子「玩得聰明」遊戲
- UI設計教程學習分享:APP佈局UIAPP
- 視覺化拖拽 UI 佈局之拖拽篇視覺化UI
- Android學習之 UI佈局優化AndroidUI優化
- 程式設計裡的“小聰明”(1)程式設計
- 名列“全球前50聰明公司”,百度AI還要撬動聰明世界AI
- SAP UI5 Form 控制元件的 ColumnLayout 佈局特性UIORM控制元件
- SAP 電商雲 Spartacus UI 頁面佈局的設計原理UI
- 蘇寧物流佈局8大冷鏈倉佈局完成:生鮮最短1h內送達
- 華為&啟明資訊:讓聰明的車遇上智慧的路
- 服務式辦公室,助力企業完成辦公佈局
- Flutter學習指南:UI佈局和控制元件FlutterUI控制元件
- 阿里Android開發規範:UI 與佈局阿里AndroidUI
- HenCoder UI 部分 2-1 佈局基礎UI
- 使用Easy UI進行頁面的簡單佈局UI
- Android UI控制元件系列:TableLayout(表格佈局)AndroidUI控制元件
- CSS佈局 --- 居中佈局CSS
- css佈局-float佈局CSS
- dispaly的Grid佈局與Flex佈局Flex
- 為什麼智慧合約是'聰明'的?
- bugku——聰明的小羊(柵欄密碼)密碼
- 幽默:智慧而非聰明的五種表現
- 聰明的投資者讀書筆記1筆記
- 演算法提高 聰明的美食家演算法