Android多屏幕适配之字体大小、行间距和字间距
code小生,一個專注Android領域的技術平臺
作者:星際旅行android
地址:https://www.jianshu.com/p/730d0b2c1c5d
聲明:本文已獲星際旅行android授權,轉發等請聯系原作者授權
今天要說的是屏幕適配字體這塊,為什么要選這么個主題呢,大家都知道Android機型眾多,不同的手機屏幕分辨率也是千差萬別,屏幕適配這塊一直是個令人頭疼的問題,不像iOS就只有一家。而字體適配又是這其中重要的一環,為什么要挑字體單獨拿出來說呢,是因為本人今天在和公司UI對設計效果圖的時候,發現怎么都難以溝通,索性寫出來做個總結,讓別人理解你之前,首先得自己整明白。
首先我遇到的第一個問題就是:
UI始終堅持認為app字體大小應該是固定的,即不同大小屏幕的手機,看到的字體是一樣一樣的。
這乍看起來似乎沒毛病,就像iPhone那樣,不同iPhone型號手機里面的APP字體大小顯示是一樣的。為什么會這樣呢,iOS App開發中字體以磅(pt)為單位的,它們的轉換關系為:pt = (px / 96) * 72,按照這樣的一個公式,比如給定字體大小7.5磅(pt) ,按照公式得到 (7.5/72)96=10px(像素),這樣不論是什么樣分辨率的iPhone最終顯示的都是一個固定的10px(像素)值。
而Android呢,按照上面iPhone的方式咱能不能直接拿來用呢,我們先去看一下谷歌官方文檔怎么寫的。
咦,瞧這谷歌文檔寫的,看來咱想直接生搬硬套iPhone是沒指望了。官方文檔可說了指定尺寸時,使用dp或sp單位,這里我們暫時不深究dp與sp之間的具體區別,咱先去瞧瞧市面上大廠的APP都是怎么處理的。
首先我們就去看下常用的qq,打開應用市場,搜索qq,
下載最新版的qq
下載完成后得到qq安裝包,接著開始進行反編譯,這里我們使用的是apktool,
之后打開qq安裝包目錄,會發現此時安裝包目錄下存在一個和qq同名的目錄文件夾,點擊進去發現里面有個res目錄的文件夾,這個就是我們想要的資源文件。
這時我們打開Android studio 新建個工程,我們將反編譯得到的res文件夾全部拷貝進新建的工程中,打開其中的一個布局文件,
可以看到里面的字體大小用的是sp,我們以同樣的方式再去看看微信
發現字體大小用的是dp,接著再去看下簡書
可以看到也是sp,最后我們再去看下新浪微博
同樣還是sp,總結下就是微信字體大小用的是dp,qq、新浪微博和簡書用的都是sp,說到這那么問題來了,這個sp 和dp到底有啥區別呢?
由于過去通常以像素為單位設計計算機用戶界面。當一個像素在80x80的時候,在高分辨率顯示器上運行該程序,則用戶界面會顯得很小。所以采用與分辨率無關的度量單位來開發程序就能夠解決這個問題。而Android應用開發支持不同的度量單位。dp: device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,這個和設備硬件有關,一般我們為了支持 WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。dp與px之間的換算公式:px = dp * (dpi / 160), dpi是Dots Per Inch(每英寸所打印的點數),對于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
在實際開發中,通常以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. 這兩個單位作用于字體大小本質上沒啥區別,唯一的區別就是:當修改系統字體大小時,字體大小以dp為單位時,大小不變;而字體大小以sp為單位時,大小會跟隨變化;
也就是說只有當我們進入到手機設置界面,手動去設置系統字體大小時,以sp為單位的字體會跟隨系統設置而做出變化,而dp則不會,其他情況下是一樣的??偨Y下就是,無論是用dp還是sp作為字體大小的單位,最終都是根據手機dpi來決定最終顯示到屏幕上的像素大小。
第二個遇到的問題就是:
字體行間距和字間距很難調合適
Android 中設置行間距有兩個方法,其中 android:lineSpacingExtra 表示額外的行間距數值,單位通常為 dp。如 android:lineSpacingExtra=”1dp”。
android:lineSpacingExtra 的值可以為負數,小數和0。如果值為正數表示增加行間距,如果值為負數表示減少行間距,如果值為0,則沒有變化。
另一個 android:lineSpacingMultiplier 表示行間距的倍數,沒有單位。如android:lineSpacingMultiplier=”1.2”。
android:lineSpacingMultiplier 的值可以為任意浮點數。如果值大于1.0表示增加行間距,如果值小于1.0表示減少行間距。
設置字間距的方法為 setLetterSpacing,
這里我們直接跟進源碼,看注釋的內容簡單的翻譯過來就是:正值擴大,負值將會使文本壓縮,這里我們看一下微博的文本是怎么設置的
我們可以看到微博這里只設置了一個行間距3dp。接著我們再去看另一家簡書
發現只有個行間距 2dp,其他的微信,qq 基本顯示的都是單行文本,行間距字間距都是默認的。總結下就是兩派要么參照 qq,微信采用默認,要么參照微博或簡書設置個行間距 2 或 3dp。OK,問題搞定,洗洗睡覺~。
適配
RecyclerView點擊item圖片,從點擊位置,放大到全屏,再次點擊關閉
Android install apk 兼容至 Android 8
分享技術我是認真的
總結
以上是生活随笔為你收集整理的Android多屏幕适配之字体大小、行间距和字间距的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何修改 Kubernetes 节点 I
- 下一篇: Android ExceptionThr