package cn.com.chenzheng_java;</p><p>import android.app.Activity;<br />import android.os.Bundle;<br />import android.util.DisplayMetrics;<br />import android.util.Log;</p><p>public class DisplayMaricsActivity extends Activity {<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);<br /> displayMarics();<br /> }</p><p> private void displayMarics(){<br /> /*DisplayMetrics主要用於查看手機相關的實際高度、寬度、密度、以及字型縮放等資訊*/<br /> DisplayMetrics metrics = new DisplayMetrics();<br /> /*getWindoeManager()擷取視窗管理器<br /> * getDefaultDisplay()擷取預設的Display<br /> * getMetrics();根據擷取的Display新的資料,初始化DisplayMetrics<br /> * */<br /> getWindowManager().getDefaultDisplay().getMetrics(metrics);<br /> Log.i("螢幕高度:", metrics.heightPixels+"");</p><p> Log.i("螢幕寬度:", metrics.widthPixels+"");</p><p> Log.i("維度密度:", metrics.density+"");</p><p> }</p><p>}</p><p>
關於這個density,我們得仔細說下。這個很重要。
density主要用來解決不同手機解析度不同導致的布局被破壞的問題。
1.什麼是density
1)density
density表示每英寸有多少個顯示點(邏輯值),它的單位是dpi:dot per inch,通常螢幕大時,density就大,螢幕小時,density就小,通常
螢幕實際解析度為240px*400px時,density=120
螢幕實際解析度為320px*533px,density=160
螢幕實際解析度為480px*800px,density=240
2)解析度
是整個屏是多少點,比如800x480,它是軟體的顯示單位
3)從Android1.6版本開始支援density(對應API Level 4)
用於解決應用在螢幕大小不同的硬體上正常顯示的問題
2.相關代碼及設定
1)AndroidManifest.xml
<supports-screens android:anyDensity="true"/>
<uses-sdk android:minSdkVersion="4"></uses-sdk>
這個參數在API Level 4也就是SDK 1.6以後才啟用的,而且1.6版本的API Level 4的應用預設值就是True
2)資來源目錄名(android 2.0以後)
res/xxx-hdpi當density為240時,使用此目錄下的資源
res/xxx-mdpi當density為160時,使用此目錄下的資源
res/xxx-ldpi當density為120時,使用此目錄下的資源
res/xxx不常尾碼,為預設設定,同xxx-mdpi
3)資源單位(xml檔案中定義大小的單位)
a)dp=dip=dx (Density independent pixel)
基於螢幕密度的抽象單位,裝置無關的點,用於說明與密度無關的尺寸和位置。這些單位是相對於一個160dpi的螢幕,所有一個dp是160dpi螢幕上的一個點。
b)px
px指軟體的單位點,裝置相關的點
c)具體使用
i.布局時盡量使用單位dip,少使用px
若使用px,如果設某控制項大小400x400px,在800x480上顯示正常,而在533x320的屏上就超出螢幕了
若使用dp,如果設某控制項大小為160x160dp,就可以通過從系統中取density來算出真正的大小,比如在800x480屏的density設為240,而533x320屏的density設為160,藉以下公式計算
pixels = dips * (density / 160)
在800x480在屏中顯示240象素,而在533x320的屏中顯示為160象素,控制項在屏中顯示的比例是一樣的。
ii.內部的處理過程分為三步:
取screen中其它元素,轉為應用的值,計算應用各控制項位置,然後再轉成800x480以供真正顯示
若res-xxx不存在,則讀取res有的資源,然後對其做相應縮放
3.實現density的關鍵源碼
1)BitmapFactory.java(用於縮放圖片)
2)ComptibilityInfo.java(用於位置計算)