在Android上,目前我知道的獲取屏幕尺寸的方法有三種不一樣的代碼形式html
方法1.在Activity中最多見的調用方式java
WindowManager windowManager = getWindowManager();android
Display display = windowManager.getDefaultDisplay();函數
int screenWidth = display.getWidth();測試
int screenHeight = display.getHeight();線程
因爲在API Level 13之後上述的getWidth和getHeight包括getOrientation都變成了@Deprecated,因此屏幕寬高用getSize替換,也就有了方法2htm
Point outSize = new Point();blog
display.getSize(outSize);資源
screenWidth = outSize.x;get
screenHeight = outSize.y;
顯然要作API Level的區分感受會不太舒服,那麼就有了第三種通用形式
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
screenWidth =dm.widthPixels;
screenHeight =dm.heightPixels;
其實上述三種代碼形式,調用的都是WindowManager的default Display object裏面的寬高尺寸,有些地方說上述這三種形式在屏幕未顯示時是拿不到具體值的,會拿到全是0的狀況,我在Activity的onCreate函數中進行對其調用發現是能取到具體數值的,並且即便不在Activity中,經過Application的onCreate函數中的以下代碼:
((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(dm);
也能順利拿到具體的屏幕寬高值。
因爲decorView是window中的最頂層view,能夠從window中獲取到decorView,而後decorView有個getWindowVisibleDisplayFrame方法能夠獲取到程序顯示的區域,包括標題欄,但不包括狀態欄。
因而就有了算出狀態欄高度的第一種代碼形式
Rect frame = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
上述代碼有時候獲取到的高度是0,網上說法是在4.0.3版本之後的都會返回0,我沒有親測,可是在個人真機上確實拿到是0,網上流出一種在源碼程序中獲取狀態欄高度的代碼:
statusBarHeight = getResources().getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);
那麼在非源碼中應該怎麼獲取呢?網上流行的一種解決方案,就是對上述須要源碼的實現方式經過反射來實現狀態欄高度的獲取,具體代碼以下:
import java.lang.reflect.Field;
//獲取手機狀態欄高度
public static int getStatusBarHeight(Context context){
Class<?> c = null;
Object obj = null;
Field field = null;
int x = 0, statusBarHeight = 38;//一般這個值會是38
try {
c = Class.forName("com.android.internal.R$dimen");
obj = c.newInstance();
field = c.getField("status_bar_height");
x = Integer.parseInt(field.get(obj).toString());
statusBarHeight = context.getResources().getDimensionPixelSize(x);
} catch (Exception e1) {
e1.printStackTrace();
}
return statusBarHeight;
}
通過測試發現這個函數在狀態欄隱藏的時候得到的值和狀態欄顯示時的值是同樣的,不會變化,並且在作橫豎屏測試時,也是同樣不會改變,即狀態欄的高度在手機上應該是固定的。
上面方法是參考了網上有個獲取狀態欄高度的帖子而來的
http://www.cnblogs.com/renkangke/archive/2013/05/27/3101375.html
上面講了獲取狀態欄,順帶就引出如何獲取標題欄高度的問題,目前我所知道的獲取標題欄高度的方法是不能在onCreate函數中直接使用,必須在UI顯示出來後調用,具體大概是layout以後進行調用吧,具體代碼以下:
int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
//statusBarHeight是上面所求的狀態欄的高度
int titleBarHeight = contentTop – statusBarHeight;
上述方法的原理就是getWindow().findViewById(Window.ID_ANDROID_CONTENT)這個方法獲取到的view是程序不包括標題欄的部分。因爲不能直接在onCreate函數中調用,因此有些調用方法是在onCreate中起一個線程,而後延時調用。
我也不知道有什麼方法能夠更加靠譜的獲取標題欄高度,若是有哪位技術牛人知道還望告知,另外這種方法與ContentView中的其它控件的尺寸獲取同樣,在onCreate中是沒法直接獲取的,直接獲取都會是0。
另外在代碼中咱們使用的是具體的像素值,具體像素值是與設備相關的,咱們通常不在代碼中直接使用具體使用像素值,而是在資源文件中定義好設備無關的dp數值,而後經過相似以下方法獲取具體的像素值int padding = getResources().getDimensionPixelSize(R.dimen.broadcast_select_padding);有時候也有一種具體數值的方法來獲取像素值,好比上述的R.dimen.broadcast_select_padding假如是16dp,則能夠經過下述方法獲取像素值DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);int padding = 16 * dm.scaledDensity可是這種方法我並不建議使用,由於Android的設備品類太多,在有些手機上這種乘法得到的值與getResources().getDimensionPixelSize得到的值並不相等,然後者確定比前者準確。