標籤:
在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.densit指的是寬度上有多少單位,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; }
Android初級教程:螢幕解析度