有一天我和老婆一起在玩我們項目做的App桦踊,她突然指著一個圖標問我:
“這個圖標有多大?”
“多大终畅?什么意思籍胯?” 我有點不太明白。
“就是這個圖標在我的手機上長寬是多少毫米离福≌壤牵”
嗯,這確實是個好問題妖爷。
初步思考
其實最簡單的方法就是拿尺子去量蝶涩,但是我們身為聰明絕頂的開發(fā)工程師,絕不能使用這種粗鄙的方法絮识。
我打開Android Studio绿聘,查看了這個圖標的實際尺寸:160x160,圖片資源文件放在xhdpi的文件夾下次舌,且布局使用的ImageView長寬設置都是wrap_content熄攘。這就代表著如果是在屏幕密度是xhdpi即320dpi,這張圖片所占用的像素值應該寬高都是160彼念,而老婆的手機是1920*1080分辨率挪圾,屏幕密度是xxhdpi即480dpi,則圖片的像素值是240逐沙。
知道像素如何推出實際大小呢哲思?首先屏幕密度dpi指的是像素/英寸,xxhdpi意味著每英寸里有480像素吩案,這樣可以推出這張圖片長寬為0.5英寸≈12.7毫米棚赔。
我興高采烈的說了一通我的方法,并告訴她答案,結果她一臉鄙夷的說:
“哈忆嗜?可是我昨天量了不是這個數啊己儒,好像有13mm多呢±粒”
我趕緊拿尺子量了一遍闪湾,發(fā)現真的超過了13mm。天啊绩卤,我居然弄錯了途样?
哪錯了
仔細回想剛才的推理過程,我通過圖片大小濒憋、存放的位置以及布局方式計算出了圖片占用的像素值何暇,然后再用像素值與屏幕密度計算出了最終大小。
可能是像素值算錯了凛驮,但是我用老婆手機調試打印了一下裆站,發(fā)現確實是寬高確實是240。那像素沒問題難道是屏幕密度錯了黔夭?
確實是屏幕密度錯了宏胯,其實仔細詳細這個問題,發(fā)現里面確實有蹊蹺本姥。
以19201080這個分辨率為例肩袍,我們知道分辨率為19201080的手機品牌有很多,而且他們的屏幕密度都聲稱是xxhdpi婚惫,如果真實情況確實如此氛赐,那么所有分辨率相同的手機屏幕長寬應該都是一樣的,即長=1920/480=4英寸先舷,寬=1080/480=2.25英寸艰管。但實際上我們知道并非如此,很多手機廠商的屏幕大小是各不相同的密浑,如5寸屏蛙婴、4.5寸屏等(這里是指對角線)。
問題就出在這里尔破,這個可以算是系統(tǒng)屏幕密度與實際屏幕密度不一致導致的一個問題街图,Android系統(tǒng)會把這類手機都當成屏幕密度是xxhdpi,所以在資源文件大小縮放懒构,或是dp與px單位轉換等問題上餐济,用的都是xxhdpi標準。其實這個差異并不會影響到我們實際的開發(fā)胆剧,因為界面布局來說不會去關心真實的物理長度絕對值絮姆。仔細想想Android這樣的目的也是為了減少碎片化醉冤。
進一步的思考
我記得當時在學習dp這個單位的時候就有一個疑問,因為dp代表的像素值是跟隨屏幕密度改變的篙悯,1dp = 屏幕密度/160像素蚁阳,而屏幕密度的概念也是每英寸的像素數,那就是意味著1dp的實際物理長度為1/160英寸鸽照。
當時覺得自己發(fā)現了很厲害的東西螺捐,但是現在想想這個東西還是不成立的。
后續(xù)
后來有一天產品寶寶拿著手機跑來問我:
“緊張矮燎,能不能告訴我這個圖片顯示的長寬定血,毫米數,我們要輸出給工信部诞外±焦担”
“你自己拿尺子量一下吧∠恳辏” 我沒有停止手頭的工作茫虽,頭也不抬的回答到。