在Android開發中,獲取手機屏幕像素的方法有多種。在這裏,我僅僅做一個小小的總結,將這些方法分爲兩類。一類是使用Activity類來獲取,另一類便是使用上下文(Context)來獲取。
/**
* @ 獲取當前手機屏幕的尺寸(單位:像素)
*/
public static float getPingMuSize(Context mContext) { int densityDpi = mContext.getResources().getDisplayMetrics().densityDpi;
float scaledDensity = mContext.getResources().getDisplayMetrics().scaledDensity;
float density = mContext.getResources().getDisplayMetrics().density;
float xdpi = mContext.getResources().getDisplayMetrics().xdpi;
float ydpi = mContext.getResources().getDisplayMetrics().ydpi;
int width = mContext.getResources().getDisplayMetrics().widthPixels;
int height = mContext.getResources().getDisplayMetrics().heightPixels;
// 這樣可以計算屏幕的物理尺寸
float width2 = (width / xdpi)*(width / xdpi);
float height2 = (height / ydpi)*(width / xdpi);
return (float) Math.sqrt(width2+height2);
}
有一些需求是獲取屏幕的大小像素
// 通過Activity類中的getWindowManager()方法獲取窗口管理,再調用getDefaultDisplay()方法獲取獲取Display對象
Display display = getActivity().getWindowManager().getDefaultDisplay();
// 方法一(推薦使用)使用Point來保存屏幕寬、高兩個數據
Point outSize = new Point();
// 通過Display對象獲取屏幕寬、高數據並保存到Point對象中
display.getSize(outSize);
// 從Point對象中獲取寬、高
int x = outSize.x;
int y = outSize.y;
// 通過吐司顯示屏幕寬、高數據522
Toast.makeText(context, "手機像素爲:X:" + x + " Y:" + y, Toast.LENGTH_LONG).show();
獲取屏幕寬高及尺寸的方法
// 通過WindowManager獲取
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
System.out.println("width-display :" + dm.widthPixels);
System.out.println("heigth-display :" + dm.heightPixels);
// 通過Resources獲取
DisplayMetrics dm2 = getResources().getDisplayMetrics();
System.out.println("width-display :" + dm2.widthPixels);
System.out.println("heigth-display :" + dm2.heightPixels);
// 獲取屏幕的默認分辨率
Display display = getWindowManager().getDefaultDisplay();
System.out.println("width-display :" + display.getWidth());
System.out.println("heigth-display :" + display.getHeight());
private static double mInch = 0;
/**
* 獲取屏幕尺寸
* @param context
* @return
*/
public static double getScreenInch(Activity context) {
if (mInch != 0.0d) {
return mInch;
}
try {
int realWidth = 0, realHeight = 0;
Display display = context.getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
if (android.os.Build.VERSION.SDK_INT >= 17) {
Point size = new Point();
display.getRealSize(size);
realWidth = size.x;
realHeight = size.y;
} else if (android.os.Build.VERSION.SDK_INT < 17
&& android.os.Build.VERSION.SDK_INT >= 14) {
Method mGetRawH = Display.class.getMethod("getRawHeight");
Method mGetRawW = Display.class.getMethod("getRawWidth");
realWidth = (Integer) mGetRawW.invoke(display);
realHeight = (Integer) mGetRawH.invoke(display);
} else {
realWidth = metrics.widthPixels;
realHeight = metrics.heightPixels;
}
mInch =formatDouble(Math.sqrt((realWidth/metrics.xdpi) * (realWidth /metrics.xdpi) + (realHeight/metrics.ydpi) * (realHeight / metrics.ydpi)),1);
} catch (Exception e) {
e.printStackTrace();
}
return mInch;
}
/**
* Double類型保留指定位數的小數,返回double類型(四捨五入)
* newScale 爲指定的位數
*/
private static double formatDouble(double d,int newScale) {
BigDecimal bd = new BigDecimal(d);
return bd.setScale(newScale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
另提一點,我們通常所指的屏幕上的int尺寸是像素單位,如需在java代碼中使用dp設定寬高請參考以下兩個方法。
//pixel = dip*density;
private int convertDpToPixel(int dp) {
DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics();
return (int)(dp*displayMetrics.density);
}
private int convertPixelToDp(int pixel) {
DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics();
return (int)(pixel/displayMetrics.density);
}
以及動態設置View寬高的方法
//獲取view 的佈局參數
ViewGroup.LayoutParams layoutParams = mShareBackgroundSign.getLayoutParams();
//設置寬度,也可自定義
layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
//設置高度
layoutParams.height = layoutParams.height = convertDpToPixel(480);;
//重新給view設置佈局參數
mShareBackgroundSign.setLayoutParams(layoutParams);