Android多屏幕適配之字體大小、行間距和字間距

今天要說的是屏幕適配字體這塊,為什么要選這么個主題呢,大家都知道Android機型眾多,不同的手機屏幕分辨率也是千差萬別,屏幕適配這塊一直是個令人頭疼的問題,不像iOS就只有一家。而字體適配又是這其中重要的一環(huán),為什么要挑字體單獨拿出來說呢,是因為本人今天在和公司UI對設計效果圖的時候,發(fā)現(xiàn)怎么都難以溝通,索性寫出來做個總結,讓別人理解你之前,首先得自己整明白。

首先我遇到的第一個問題就是:UI始終堅持認為app字體大小應該是固定的,即不同大小屏幕的手機,看到的字體是一樣一樣的。

這乍看起來似乎沒毛病,就像iPhone那樣,不同iPhone型號手機里面的APP字體大小顯示是一樣的。為什么會這樣呢,iOS App開發(fā)中字體以磅(pt)為單位的,它們的轉換關系為:pt = (px / 96) * 72,按照這樣的一個公式,比如給定字體大小7.5磅(pt)?,按照公式得到?(7.5/72)96=10px(像素),這樣不論是什么樣分辨率的iPhone最終顯示的都是一個固定的10px(像素)值。

而Android呢,按照上面iPhone的方式咱能不能直接拿來用呢,我們先去看一下谷歌官方文檔怎么寫的。

咦,瞧這谷歌文檔寫的,看來咱想直接生搬硬套iPhone是沒指望了。官方文檔可說了指定尺寸時,使用dp或sp單位,這里我們暫時不深究dp與sp之間的具體區(qū)別,咱先去瞧瞧市面上大廠的APP都是怎么處理的。

首先我們就去看下常用的qq,打開應用市場,搜索qq,

下載最新版的qq

下載完成后得到qq安裝包,接著開始進行反編譯,這里我們使用的是apktool,

之后打開qq安裝包目錄,會發(fā)現(xiàn)此時安裝包目錄下存在一個和qq同名的目錄文件夾,點擊進去發(fā)現(xiàn)里面有個res目錄的文件夾,這個就是我們想要的資源文件。

這時我們打開Android studio 新建個工程,我們將反編譯得到的res文件夾全部拷貝進新建的工程中,打開其中的一個布局文件,

可以看到里面的字體大小用的是sp,我們以同樣的方式再去看看微信


發(fā)現(xiàn)字體大小用的是dp,接著再去看下簡書


可以看到也是sp,最后我們再去看下新浪微博


同樣還是sp,總結下就是微信字體大小用的是dp,qq、新浪微博和簡書用的都是sp,說到這那么問題來了,這個sp 和dp到底有啥區(qū)別呢?

由于過去通常以像素為單位設計計算機用戶界面。當一個像素在80x80的時候,在高分辨率顯示器上運行該程序,則用戶界面會顯得很小。所以采用與分辨率無關的度量單位來開發(fā)程序就能夠解決這個問題。而Android應用開發(fā)支持不同的度量單位。dp:?device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,這個和設備硬件有關,一般我們?yōu)榱酥С?WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。dp與px之間的換算公式:px = dp * (dpi / 160),?dpi是Dots Per Inch(每英寸所打印的點數(shù)),對于Android手機來說,常見的dpi有如下幾種:

ldpi:對應的dpi范圍為0 ~ 120,也就是說每英寸有0到120個像素點的屏幕的屏幕密度都屬于ldpi

mdpi:dpi范圍為120 ~ 160

hdpi:dpi范圍為160 ~ 240

xhdpi:dpi范圍為240~320

xxhdpi:dpi范圍為320~480

在實際開發(fā)中,通常以dpi值120、160、240、320、480分別指代ldpi、mdpi、hdpi、xhdpi、xxhdpi。

也就是說,當我們設置字體大小為10dp,dpi為320的xhdpi的Android機,通過換算公式:px=10*(320/160),最終得到20px(像素)大小,如果是dpi為480的xxhdpi的Android機,通過公式得到30px(像素)大小。

sp:?scaled pixels(放大像素). 主要用于字體顯示best for textsize.?這兩個單位作用于字體大小本質上沒啥區(qū)別,唯一的區(qū)別就是:當修改系統(tǒng)字體大小時,字體大小以dp為單位時,大小不變;而字體大小以sp為單位時,大小會跟隨變化


也就是說只有當我們進入到手機設置界面,手動去設置系統(tǒng)字體大小時,以sp為單位的字體會跟隨系統(tǒng)設置而做出變化,而dp則不會,其他情況下是一樣的??偨Y下就是,無論是用dp還是sp作為字體大小的單位,最終都是根據(jù)手機dpi來決定最終顯示到屏幕上的像素大小。

第二個遇到的問題就是:字體行間距和字間距很難調合適

Android中設置行間距有兩個方法,其中android:lineSpacingExtra表示額外的行間距數(shù)值,單位通常為dp。如android:lineSpacingExtra=”1dp”。?

android:lineSpacingExtra的值可以為負數(shù),小數(shù)和0。如果值為正數(shù)表示增加行間距,如果值為負數(shù)表示減少行間距,如果值為0,則沒有變化。

另一個android:lineSpacingMultiplier表示行間距的倍數(shù),沒有單位。如android:lineSpacingMultiplier=”1.2”。?

android:lineSpacingMultiplier的值可以為任意浮點數(shù)。如果值大于1.0表示增加行間距,如果值小于1.0表示減少行間距。

設置字間距的方法為setLetterSpacing,?


這里我們直接跟進源碼,看注釋的內容簡單的翻譯過來就是:正值擴大,負值將會使文本壓縮,這里我們看一下微博的文本是怎么設置的


我們可以看到微博這里只設置了一個行間距3dp。接著我們再去看另一家簡書


發(fā)現(xiàn)只有個行間距2dp,其他的微信,qq基本顯示的都是單行文本,行間距字間距都是默認的。總結下就是兩派要么參照qq,微信采用默認,要么參照微博或簡書設置個行間距2或3dp。OK,問題搞定,洗洗睡覺~。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評論 25 709
  • 本文參考自: Google的官方權威適配文檔 郭霖:Android官方提供的支持不同屏幕大小的全部方法 Storm...
    M悇芐冋憶閱讀 13,275評論 5 56
  • 1、基礎概念 屏幕尺寸 含義:指的屏幕對角線的物理長度,單位一般采用英寸(1英寸≈2.53cm) 目前市面常見的有...
    古都舊城閱讀 2,912評論 0 1
  • 沮喪的人簡介 因為我才14歲,沒有寫作經(jīng)驗因此就根據(jù)自己性格把自己叫為沮喪的人。也在不開心時或才思全涌時寫下一...
    林長得真俊杰閱讀 195評論 0 0
  • 翻微博,每個人都很喪。 從需要擁抱,到醉酒懷念,到空門尋道,再到?jīng)]有安全感的需要現(xiàn)世安穩(wěn)。每個人,都繞在自己的圈子...
    與張白水閱讀 200評論 0 0

友情鏈接更多精彩內容