新開了 <<Android Tips>> 文集,這個(gè)文集主要分享一些短小、簡單實(shí)用的小技巧。希望大家喜歡。
最近幾天逛博客時(shí),趕巧遇到了好幾個(gè)人在談Android的虛擬按鍵適配,問題大概是這樣的:
有不少手機(jī),比如華為的大部分手機(jī),Nexus 等都是不帶實(shí)體按鍵的,取而代之的是虛擬按鍵,學(xué)名叫 NavigationBar。NavigationBar 顯示時(shí)會(huì)占用一定的屏幕高度,使得 Activity 實(shí)際的布局高度變窄了,如果 Activity 中的視圖太高,則視圖的底部會(huì)被 NavigationBar 切掉(遮擋)。
我有點(diǎn)好奇,為什么大家普遍在這個(gè)問題上糾結(jié)。其實(shí),我并不把它看成是一個(gè)技術(shù)問題。而應(yīng)該是一個(gè)對(duì)設(shè)計(jì)稿的理解問題。
設(shè)計(jì)師在設(shè)計(jì)視覺稿的時(shí)候,一般會(huì)考慮預(yù)留出狀態(tài)欄區(qū)域,將除狀態(tài)欄以外的區(qū)域作為設(shè)計(jì)區(qū)域。但她們基本不會(huì)考慮 NavigationBar。視覺稿中底部的一些 UI 元素,往往是通過一些 marginTop 來讓它們看起來在底部。
試想一下,如果我們在實(shí)現(xiàn)的時(shí)候,如果完全按照視覺稿中的 marginTop 去做豎向布局,則在帶有 NavigationBar 的手機(jī)上,實(shí)際可用的布局高度小于視覺稿中的設(shè)計(jì)高度時(shí),超出部分的內(nèi)容就會(huì)被切掉,也就出現(xiàn)了所謂的適配問題。貼一個(gè)一般公式:
設(shè)計(jì)高度 = 屏幕高度 - 狀態(tài)欄高度
布局高度 = 屏幕高度 - 狀態(tài)欄高度 - 虛擬按鍵高度
要解決這個(gè)問題,其實(shí)很簡單,我說過,這不是一個(gè)技術(shù)問題,因此不必使用 fitsSystemWindows 屬性,也避免了副作用。只需要在布局時(shí),正確理解設(shè)計(jì)師的意圖,比如,如果一個(gè)按鈕在最底部,你應(yīng)該用 layout_gravity="bottom" 而不是用 marginTop 或者其他方式來把它撐到底部。
一個(gè)中心思想是:盡可能的從下往上,而非從上往下布局。不要盲目的完全按照視覺稿中的尺寸去布局,應(yīng)該區(qū)分出不同視覺元素的重要性,優(yōu)先保證最上方和最下方的元素正確顯示,至于中間的元素,多多用相對(duì)布局或是weight屬性吧。
好了,周末愉快。
額,貌似這篇文章所講述的內(nèi)容和大家所期望的不是同一個(gè)東西。