寫過多少布局,做過多少適配硫惕。我認(rèn)真著茧痕,你的不知所措。這種迷茫心情 我想誰都會有恼除,幸運的是能分擔(dān)你的愁踪旷。我tm居然唱出來了。你敢信豁辉?
沒錯埃脏,今天雞排君從頭講設(shè)備尺寸和適配這點事情。也許當(dāng)時跑得太急秋忙,沒好好回頭欣賞它的美彩掐。學(xué)習(xí)的時候只看到了怎么用,卻沒有思考這些是怎么出現(xiàn)的』易罚現(xiàn)在握緊我的手堵幽,帶你一步一步推導(dǎo)這些看上去很基礎(chǔ),卻有時模模糊糊的東西弹澎。(比如自定義View里的單位如何適配朴下?)
本篇你能收獲什么?
- 如標(biāo)題一樣苦蒿,徹底搞清楚android上的適配由來而不是背了概念
- 還有抓住一直大雞排殴胧。
目錄
- 什么是屏幕尺寸
- 一寸到底是多少?
- DPI每英寸點數(shù)
- 獨立的像素密度是什么佩迟?
- 屏幕相關(guān)的api
注:這里的推導(dǎo)是自己的理解团滥,非官方的解釋
什么是屏幕尺寸?
我們來看下面這幅圖报强,屏幕對角線的長度灸姊。(即:設(shè)備的左上角至右邊下角那條線)
注意:我們需要知道對角線的長度怎么算的,其實很簡單秉溉,利用勾股定律即可力惯。
根號下720平方+1280平方等于設(shè)備對角線像素。
√720*720+1280*1280
=√518400+1638400
=√2156800
≈1468.6047800(px)
另一個疑惑就出現(xiàn)了召嘶,我們平時描述的4.3寸父晶、5寸是指屏幕的什么。
這里的寸是指什么鬼弄跌?
為什么我們算出了是1468這么大甲喝?
黑人問號臉?碟绑?why
一寸到底是多少俺猿?
那哦跟濃港啊茎匠,介鍋一寸 巴拉巴拉啦.....
停 打住,我聽不懂那些押袍。
那好吧诵冒,我們現(xiàn)在手上這臺設(shè)備是720*1280,我們前面計算過它的屏幕對角尺寸約等于1468個像素密度谊惭。注意這里說的是屏幕對角尺寸
不是屏幕尺寸
汽馋。商家描述說這臺碉堡的手機是4.5寸的。既然這里的尺寸就是指對角線圈盔。我們反向推算豹芯。
1468/4.5
≈326.2222
這里得到326.222就是我們這臺設(shè)備的一寸所占的像素點。
DPI每英寸點數(shù)
我們首先知道驱敲,谷歌官方把android設(shè)備的參考標(biāo)準(zhǔn)定義為一寸是160px
這里會get一個概念叫dpi(dpi:dots per inch )铁蹈。即每寸的像素有多少個點。面試的時候經(jīng)常有同學(xué)把dpi握牧、dip娩梨、dp弄混了。下面我接著推狈定。
現(xiàn)在要說一下獨立的像素密度了颂龙。獨立的像素密度?纽什?聽著就好繞口,俺有一句mmp稿湿,不知道當(dāng)講不當(dāng)講押赊,這又是蛇饺藤?
獨立像素密度DIP/DP
好,既然谷歌的一寸是160px流礁,為什么我們是剛剛算出來的是320px?(為了方便計算神帅,省去那6個像素點,別跟我糾結(jié)了)
嗯元镀,這個問題問得好!
因為android設(shè)備中160px每寸的密度無法滿足用戶的鈦合金眼栖疑,甚至覺得顆粒感爆炸好喵?
所以廠商將 原本160個像素中又插入一波160像素卿闹。就變成 了320像素萝快。如下圖所示。(真實的屏幕生產(chǎn)不是這樣插像素的揪漩,這里只是便于理解奄容。)
一開始只有紅色的像素點,后面插入了一些像素進來嫩海。在同樣的空間下密度增大了一倍叁怪。所以320像素得到了解釋。
由此我們又得到一個概念叫密度奕谭。(density)
320/160
=2
這里的密度就是2了,所以我們開發(fā)中寫1dp在720*1280的設(shè)備上會變成2px官册。有興趣的小伙伴可以寫一個自定義View把1dp設(shè)置成寬度难捌,然后在View里打印一下1dp的寬度得到的是不是2px。同理在其他分辨率上也是一樣的算法员淫。
如:240/160=1.5(倍密度)
實際情況下击敌,你現(xiàn)在的設(shè)備如果密度是2.0,那么你布局時1dp將轉(zhuǎn)換成2px在設(shè)備上呈現(xiàn)。
到這里我們總算是明白了刃宵,什么是獨立像素密度徘公。即:dp轉(zhuǎn)換成px代表幾個像素。業(yè)界把它叫做 Density independent pixels 簡稱dip从隆,直譯過來的意思是獨立的像素密度缭裆。
用我自己的話來講,*dp是運行在物理設(shè)備之前用來描述控件大小的一種描述單位辛燥,其中我們開發(fā)中用的單位dp就是dip一個意思缝其。而dpi是指每寸像素密度。不要再弄混了喔内边。喔喔喔!W旄摺和屎!
**現(xiàn)在回過頭來看下面的概念,是不是清晰多了套啤? **
- dip: Density independent pixels 随常,設(shè)備無關(guān)像素。
- dp :就是dip(以后別糾結(jié)dip和dp的區(qū)別了好么)
- px : 像素
- dpi :dots per inch 止潮,一英寸多少個像素點钞楼。素密度
- density : 密度
- 分辨率 : 橫縱2個方向的像素點的數(shù)量
- 屏幕尺寸: 屏幕對角線的長度
屏幕相關(guān)的api
DisplayMetrics metric =Resources.getSystem().getDisplayMetrics()袄琳;
int DMwidth = metric.widthPixels; // 屏幕寬度(px)
int DMheight = metric.heightPixels; // 屏幕高度(px)
float DMdensity = metric.density; // 屏幕密度(/ 1.0 / 1.5/ 2.0)
int DMdensityDpi = metric.densityDpi; // 屏幕密度DPI(160 / 240/ 320)
Log.e("metric","屏幕寬度="+DMwidth+" 屏幕高度="+DMheight+" 屏幕密度="+DMdensity+" 屏幕密度DPI"+DMdensityDpi);
下一篇我會對自定義View單位從源碼層進行剖析燃乍。
View單位轉(zhuǎn)換的秘密(系統(tǒng)源碼分析)
如何下次找到我?
- 關(guān)注我的簡書
- 本篇同步Github倉庫:https://github.com/BolexLiu/DevNote (可以關(guān)注)