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