屏幕解析度:在x y軸上的像素點數。單位是px,1px=1個像素點。一般以 縱向像素×橫向像素 表示,如1920*1080dpi 每英寸上的像素點數(斜角的px數目 ÷ 斜角的inch數目),dot per inch的縮寫,與屏幕尺寸和屏幕解析度有關。 以三星C9 pro為例,官方參數為1920×1 ...
屏幕解析度:在x y軸上的像素點數。單位是px,1px=1個像素點。一般以 縱向像素×橫向像素 表示,如1920*1080
dpi--------------------------每英寸上的像素點數(斜角的px數目 ÷ 斜角的inch數目),dot per inch的縮寫,與屏幕尺寸和屏幕解析度有關。
以三星C9 pro為例,官方參數為1920×1080,屏幕尺寸4.95 inch 是屏幕對角線長度,
(19202 +10802)1/2/ 4.95inch = 445dpi
px--------------------------像素,構成圖像的最小單位。
1px代表屏幕上一個物理的像素點;px單位不建議使用,因為同樣100px的圖片,在不同手機上顯示的實際大小可能不同,
但是偶爾用到px的情況,是需要畫1像素表格線或陰影線的時候,用其他單位如dp會顯得模糊。
dp==dip ------------------密度無關像素,Density Independent Pixels的縮寫,設備不依賴像素的一個單位
dp是為了使開發者設置的長度能根據不同屏幕(解析度/英寸也就是dpi)獲得不同的像素(px)數量。如:將控制項設長度為1dp,那麼在160dpi的屏幕上該控制項長度為1px,在240dpi的屏幕上該控制項的長度為1*240/160=1.5個像素點。也就是dp會隨著不同屏幕而改變控制項長度的像素數量。
dp的官方敘述:當屏幕每英寸有160個像素時(也就是160dpi),dp與px等價的。那如果每英寸240個像素呢?1dp—>1*240/160=1.5px,即1dp與1.5px等價了。
其實記住一點,dp最終都要化為像素數量來衡量大小的,因為只有像素數量最直觀。
如果Android手機每英寸有160px,即手機是160dpi,那麼此時1dp就可以理解為1px,假如現在手機是240dpi,那麼1dp=240/160 px=1.5px
一個手機屏幕最大有多大的dp呢,我能不能設置成1億dp呢?如現在將控制項寬度設置為160dp,那不同dpi的手機所得到的像素是多少呢?
sp --------------------------Scale-Independent Pixels,可以根據文字大小首選項進行放縮,常用於設置字體大小。最好使用12sp大小以上的尺寸,推薦使用12sp、14sp、18sp、22sp,儘量避免使用奇數或小數,因為容易造成精 度的丟失。與縮放無關的抽象像素,sp和dp很類似但唯一的區別是,Android系統允許用戶自定義文字尺寸大小(小、正常、大、超大等等),當文字尺寸是“正常”時1sp=1dp=0.00625英寸,而當文字尺寸是“大”或“超大”時,1sp>1dp=0.00625英寸。類似我們在windows里調整字體尺寸以後的效果——視窗大小不變,只有文字大小改變。
應用實例
Drawable之getIntrinsicWidth()和getIntrinsicHeight()
Drawable--------------A Drawable is a general abstraction for "something that can be drawn."
getIntrinsicWidth()和getIntrinsicHeight(),顧名思義他們是用來取得Drawable的固有的寬度和高度。那麼問題就來了:我們有時候通過這兩個方法取到的寬和高和實際的並不一樣,怎麼回事?
在assets中放了了一張png圖片,它的解析度是807x1211,然後通過Drawable.createFromStream(is, null)生成一個Drawable對象,最後利用上面的兩個方法取drawable對象的寬高,居然結果是404x606。這是怎麼回事呢?
Drawable這個類是對所有可以畫的東西的抽象,他可以是一張圖片,也可以是實體的顏色,線等等,我們不能簡單的認為它是一張圖片。
測試Android機器320dpi,按照上面的介紹1dp = 320 / 160 px 。
所以上面兩個方法的單位應該是dp,因為 807 px ÷(320 / 160)=403.5 1211px ÷(320 / 160)=605.5
現在明白了吧,getIntrinsicWidth()和getIntrinsicHeight()返回的寬高應該是dp為單位的。
本文結束