android 布局中的單位及解析度自解

來源:互聯網
上載者:User

先上一個網上copy的

px:是螢幕的像素點

in:英寸

mm:毫米

pt:磅,1/72 英寸

dp:一個基於density的抽象單位,如果一個160dpi的螢幕,1dp=1px

dip:等同於dp

sp:同dp相似,但還會根據使用者的字型大小偏好來縮放。

建議使用sp作為文本的單位,其它用dip

然後是我自己的理解:

Android的螢幕密度是以160為基準的,

螢幕密度(densityDpi)為160時, 是將一英寸分為160份, 每一份是1像素. 如果螢幕密度(densityDpi)為240時, 是將一英寸分為240份, 每一份是1像素. 1英寸/160(機器x)  =  1英寸/240(機器y)  =  1px

打個比方, 一個三英寸的顯示螢幕的機器, 如果螢幕密度(densityDpi)為160, 即密度比(density)1.0時, 畫一條160dip和160px的線條, 兩個都是1英寸. 可如果還是三英寸的螢幕, 如果螢幕密度(densityDpi)變為320, 即密度比(density)2.0時,1英寸有320像素了, 此時160px顯示就是半英寸. 160dip顯示還是1英寸, 因為 1dip = 1px * density .

 

可是你有沒有注意到, 同樣寬的螢幕, 比如3英寸, 如果density 是1.0的話, 解析度就是480dip*x或480px,*x 如果還是3英寸的, density 是1.5的話 , 解析度就是480*1.5 = 720px*x 或480dip*x. (這裡的x代表螢幕的高度). 如果同樣是240dip, 在兩款機器上顯示都是一半的長度, 這樣就保證了比例. 這樣的話如果是480解析度和720解析度的話, 可以採用同一個布局檔案了.

 

又但可是, 我見過的機器只有320*240(0.75) , 480*320(1.0) , 800*480(1.5), 854*480(1.5) , 如果是480 和 800 兩個版本, 同一條線480dip , 480顯示全屏, 800則顯示 480 / (800 / 1.5)  屏 . 其中800/1.5是螢幕的總dip . 我們平時說的解析度都是以像素px為單位的.  

由此可見, 就算是用dip, 也不能保證不同解析度的機器的布局比例完全一樣.  但還是有好處的. 因為如果是用px的話, 有些時候一些布局直接跑到了螢幕外邊, 調試起來很麻煩. 

還有, google代碼裡邊所用的單位都是以px為預設單位的. 

apk的資源套件中,當螢幕density=240時使用hdpi標籤的資源

當螢幕density=160時,使用mdpi標籤的資源

當螢幕density=120時,使用ldpi標籤的資源。

在每英寸160點的顯示器上,1dp = 1px。

 

下面是幾種不同單位的相互轉換.

public static int dip2px(Context context, float dipValue){ 
final float scale = context.getResources().getDisplayMetrics().density; 
return (int)(dipValue * scale + 0.5f); 

public static int px2dip(Context context, float pxValue){ 
final float scale = context.getResource().getDisplayMetrics().density; 
return (int)(pxValue / scale + 0.5f); 

public static int dip2px(Context context, float dipValue){ 
final float scale = context.getResources().getDisplayMetrics().density; 
return (int)(dipValue * scale + 0.5f); 

public static int px2dip(Context context, float pxValue){ 
final float scale = context.getResource().getDisplayMetrics().density; 
return (int)(pxValue / scale + 0.5f); 

下面說下如何擷取解析度:

    在一個Activity的onCreate方法中,寫入如下代碼:
        DisplayMetrics metric = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metric);
        int width = metric.widthPixels;  // 螢幕寬度(像素)
        int height = metric.heightPixels;  // 螢幕高度(像素)
        float density = metric.density;  // 螢幕密度(0.75 / 1.0 / 1.5)
        int densityDpi = metric.densityDpi;  // 螢幕密度DPI(120 / 160 / 240)
這還是挺簡單的, 可是你有沒有在800*480的機器上試過, 是不是得到的寬度是533 ? 因為android剛開始時預設的density是1.0 , 此時你可以再manifest.xml中加入

1.uses-sdk節點, <uses-sdk android:minSdkVersion="4" /> , 表示不sdk1.6以下的機器不能安裝你的apk了.

2.supports-screens 節點. 

   <supports-screens
            android:smallScreens="true"
            android:normalScreens="true"
            android:largeScreens="true"
            android:resizeable="true"
            android:anyDensity="true" />

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.