1. 程式人生 > >Android開發筆記(三)螢幕解析度

Android開發筆記(三)螢幕解析度

在app編碼中經常需要獲取手機的螢幕解析度(寬*高),原來我直接上網拷貝程式碼,但在使用過程中卻發現諸多不便。 不便一:下面程式碼中的getWidth和getHeight在adt上提示deprecated已經廢棄了,實在扎眼

  WindowManager wm = getWindowManager();    
  Display display = wm.getDefaultDisplay();   
  int screenWidth = display.getWidth();    
  int screenHeight = display.getHeight();  
檢視android原始碼說可使用getSize替代,於是換成getSize並把程式碼提煉到工具類中
	public static Point getSize(Activity act) {
		Display display = act.getWindowManager().getDefaultDisplay();
		Point size = new Point();
		display.getSize(size);  //size.x就是寬度,size.y就是高度
		return size;
	}

用了一陣發現又有不便,原因是getWindowManager方法只能在activity中使用或者被activity例項呼叫,那像我們在Fragment或者Adapter中想獲得螢幕解析度,又有困難了(因為Fragment和Adapter一般只有Context),雖然可以通過強制型別轉換來處理,可是畢竟勞民傷財需要時時記得去轉換。所以又改了從Context獲取系統服務,然後再去取解析度,改後的程式碼如下

	public static Point getSize(Context ctx) {
		WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
		Display display = wm.getDefaultDisplay();
		Point size = new Point();
		display.getSize(size);
		return size;
	}
再後來發現通過DisplayMetrics也能獲取解析度,依網上的做法照貓畫虎如下:
	public static Point getSizeNew(Context ctx) {
		WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
		DisplayMetrics dm = new DisplayMetrics();
		wm.getDefaultDisplay().getMetrics(dm);
		Point size = new Point();
		size.x = dm.widthPixels*dm.density;
		size.y = dm.heightPixels*dm.density;
		return size;
	}
不久便發現這個新方法時常量錯了,找來找去又自己反覆實踐,結果確認widthPixels和heightPixels就是寬和高,無需再乘上density。因為widthPixels和heightPixels的單位都是畫素,而density指的是畫素密度,即一個單位內有幾個畫素,所以在我這邊乘上density沒有意義,只有除以density才有意義。dm.widthPixels/dm.density指的是寬度上有多少單位,dm.heightPixels/dm.density指的是高度上有多少單位。網上乘以density的做法,可能只是他們恰好遇上部分特殊機型罷了。最後的程式碼如下:
	public static Point getSizeNew(Context ctx) {
		WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
		DisplayMetrics dm = new DisplayMetrics();
		wm.getDefaultDisplay().getMetrics(dm);
		Point size = new Point();
		size.x = dm.widthPixels;
		size.y = dm.heightPixels;
		return size;
	}