首先說說density,density值表示每英寸有多少個顯示點,與分辨率是兩個不同的概念。
Android主要有以下幾種屏:
QVGA和WQVGA屏density=120;
HVGA屏density=160;
WVGA屏density=240;
下面以480dip*800dip的WVGA(density=240)爲例,詳細列出不同density下屏幕分辨率信息:
當density=120時 屏幕實際分辨率爲240px*400px (兩個點對應一個分辨率)
狀態欄和標題欄高各19px或者25dip
橫屏是屏幕寬度400px 或者800dip,工作區域高度211px或者480dip
豎屏時屏幕寬度240px或者480dip,工作區域高度381px或者775dip
density=160時 屏幕實際分辨率爲320px*533px (3個點對應兩個分辨率)
狀態欄和標題欄高個25px或者25dip
橫屏是屏幕寬度533px 或者800dip,工作區域高度295px或者480dip
豎屏時屏幕寬度320px或者480dip,工作區域高度508px或者775dip
density=240時 屏幕實際分辨率爲480px*800px (一個點對於一個分辨率)
狀態欄和標題欄高個38px或者25dip
橫屏是屏幕寬度800px 或者800dip,工作區域高度442px或者480dip
豎屏時屏幕寬度480px或者480dip,工作區域高度762px或者775dip
apk的資源包中,當屏幕density=240時使用hdpi標籤的資源
當屏幕density=160時,使用mdpi標籤的資源
當屏幕density=120時,使用ldpi標籤的資源。
不加任何標籤的資源是各種分辨率情況下共用的。
建議:佈局時儘量使用單位dip,少使用px。
device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,這個和設備硬件有關,一般我們爲了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。
- import android.content.Context;
- import android.util.DisplayMetrics;
- /**
- * 計算公式 pixels = dips * (density / 160)
- *
- * @version 1.0.1 2010-12-11
- *
- * @author
- */
- public class DensityUtil {
- private static final String TAG = DensityUtil.class.getSimpleName();
- // 當前屏幕的densityDpi
- private static float dmDensityDpi = 0.0f;
- private static DisplayMetrics dm;
- private static float scale = 0.0f;
- /**
- *
- * 根據構造函數獲得當前手機的屏幕係數
- *
- * */
- public DensityUtil(Context context) {
- // 獲取當前屏幕
- dm = new DisplayMetrics();
- dm = context.getApplicationContext().getResources().getDisplayMetrics();
- // 設置DensityDpi
- setDmDensityDpi(dm.densityDpi);
- // 密度因子
- scale = getDmDensityDpi() / 160;
- Logger.i(TAG, toString());
- }
- /**
- * 當前屏幕的density因子
- *
- * @param DmDensity
- * @retrun DmDensity Getter
- * */
- public static float getDmDensityDpi() {
- return dmDensityDpi;
- }
- /**
- * 當前屏幕的density因子
- *
- * @param DmDensity
- * @retrun DmDensity Setter
- * */
- public static void setDmDensityDpi(float dmDensityDpi) {
- DensityUtil.dmDensityDpi = dmDensityDpi;
- }
- /**
- * 密度轉換像素
- * */
- public static int dip2px(float dipValue) {
- return (int) (dipValue * scale + 0.5f);
- }
- /**
- * 像素轉換密度
- * */
- public int px2dip(float pxValue) {
- return (int) (pxValue / scale + 0.5f);
- }
- @Override
- public String toString() {
- return " dmDensityDpi:" + dmDensityDpi;
- }
- }
import android.content.Context;
import android.util.DisplayMetrics;
/**
* 計算公式 pixels = dips * (density / 160)
*
* @version 1.0.1 2010-12-11
*
* @author
*/
public class DensityUtil {
private static final String TAG = DensityUtil.class.getSimpleName();
// 當前屏幕的densityDpi
private static float dmDensityDpi = 0.0f;
private static DisplayMetrics dm;
private static float scale = 0.0f;
/**
*
* 根據構造函數獲得當前手機的屏幕係數
*
* */
public DensityUtil(Context context) {
// 獲取當前屏幕
dm = new DisplayMetrics();
dm = context.getApplicationContext().getResources().getDisplayMetrics();
// 設置DensityDpi
setDmDensityDpi(dm.densityDpi);
// 密度因子
scale = getDmDensityDpi() / 160;
Logger.i(TAG, toString());
}
/**
* 當前屏幕的density因子
*
* @param DmDensity
* @retrun DmDensity Getter
* */
public static float getDmDensityDpi() {
return dmDensityDpi;
}
/**
* 當前屏幕的density因子
*
* @param DmDensity
* @retrun DmDensity Setter
* */
public static void setDmDensityDpi(float dmDensityDpi) {
DensityUtil.dmDensityDpi = dmDensityDpi;
}
/**
* 密度轉換像素
* */
public static int dip2px(float dipValue) {
return (int) (dipValue * scale + 0.5f);
}
/**
* 像素轉換密度
* */
public int px2dip(float pxValue) {
return (int) (pxValue / scale + 0.5f);
}
@Override
public String toString() {
return " dmDensityDpi:" + dmDensityDpi;
}
}
只是查看的話在onCreate()
加入下面幾句;
// DisplayMetrics dm =new DisplayMetrics() ;
// dm=this.getApplicationContext().getResources().getDisplayMetrics();
// float previewDensity= dm.density;
// int dip= dm.densityDpi;
//
// Log.e("________previewDensity"," " + dip+" " +previewDensity );
java 中 print類似的用法
String str = String.format("mWorkDir=%s ,number= %d", mWorkDir, number);
Log.e("TAG",str);