首先講一下我們要怎樣獲取屏幕寬高呢?
/**
* 獲取屏幕寬度,以像素爲單位.
* @param context
* @return
*/
public static int getScreenWidth(Activity context) {
DisplayMetrics dm = new DisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.widthPixels;
}
/**
* 獲取屏幕高度,以像素爲單位.
* @param context
* @return
*/
public static int getScreenHeight(Activity context) {
DisplayMetrics dm = new DisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.heightPixels;
}
我們Android平臺是一個又一個的Activity組成的,每一個Activity有一個或者多個View構成。所以說,當我們想顯示一個界面的時候,我們首先想到的是建立一個Activity,然後所有的操作在Activity裏面實現。這種方式固然簡單,但是在有些情況下,我們要求的只是簡單的顯示,用Activity顯然是多餘,這個時候,我們如何處理呢?
原來,整個Android的窗口機制是基於一個叫做 WindowManager,這個接口可以添加view到屏幕,也可以從屏幕刪除view。它面向的對象一端是屏幕,另一端就是View,直接忽略我們以前的Activity或者Dialog之類的東東。其實我們的Activity或者Diolog底層的實現也是通過WindowManager,這個 WindowManager是全局的。它是顯示View的最底層了。
寫一個簡單的代碼:
- WindowManager mWm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
- Button view = new Button(this);
- view.setText("window manager test!");
- WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
- mWm.addView(view, mParams);
- //改變Dialog背景透明度
- Dialog dg = new Dialog(this);
- Window window = dg.getWindow();
- WindowManager.LayoutParams lp = window.getAttributes();
- lp.alpha = 0.5f;
- window.setAttributes(lp);
- //lp.alpha = 0.5f 透明度設置 其值要合理 自己反覆測試
- //爲什麼要這個技巧 因爲很多人說:彈出Dialog會導致背景變暗 有Animation發生 導致性能變慢 可以用這個改變之 而且可以藉助這個 使得全透明 不擋住Dialog後面內容的顯示
一般在剛開始開發android時,會犯一個錯誤,即在View的構造函數中獲取getWidth()和getHeight(),當一個view對象創建時,android並不知道其大小,所以getWidth()和getHeight()返回的結果是0,真正大小是在計算佈局時纔會計算,所以會發現一個有趣的事,即在onDraw( ) 卻能取得長寬的原因。
- width = activity.getWindowManager().getDefaultDisplay().getWidth();
- height = activity.getWindowManager().getDefaultDisplay().getHeight();
我們要怎樣獲取屏幕寬高呢?
/**
* 獲取屏幕寬度,以像素爲單位.
* @param context
* @return
*/
public static int getScreenWidth(Activity context) {
DisplayMetrics dm = new DisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.widthPixels;
}
/**
* 獲取屏幕高度,以像素爲單位.
* @param context
* @return
*/
public static int getScreenHeight(Activity context) {
DisplayMetrics dm = new DisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.heightPixels;
}
WindowManager.LayoutParams.type屬性
type 的取值:
應用程序窗口。
public static final int FIRST_APPLICATION_WINDOW = 1;
所有程序窗口的“基地”窗口,其他應用程序窗口都顯示在它上面。
public static final int TYPE_BASE_APPLICATION =1;
普通應用功能程序窗口。token必須設置爲Activity的token,以指出該窗口屬誰。
public static final int TYPE_APPLICATION = 2;
用於應用程序啓動時所顯示的窗口。應用本身不要使用這種類型。
它用於讓系統顯示些信息,直到應用程序可以開啓自己的窗口。
public static final int TYPE_APPLICATION_STARTING = 3;
應用程序窗口結束。
public static final int LAST_APPLICATION_WINDOW = 99;
子窗口。子窗口的Z序和座標空間都依賴於他們的宿主窗口。
public static final int FIRST_SUB_WINDOW = 1000;
面板窗口,顯示於宿主窗口上層。
public static final int TYPE_APPLICATION_PANEL = FIRST_SUB_WINDOW;
媒體窗口,例如視頻。顯示於宿主窗口下層。
public static final int TYPE_APPLICATION_MEDIA = FIRST_SUB_WINDOW+1;
應用程序窗口的子面板。顯示於所有面板窗口的上層。(GUI的一般規律,越“子”越靠上)
public static final int TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW +2;
對話框。類似於面板窗口,繪製類似於頂層窗口,而不是宿主的子窗口。
public static final int TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW +3;
媒體信息。顯示在媒體層和程序窗口之間,需要實現透明(半透明)效果。(例如顯示字幕)
public static final int TYPE_APPLICATION_MEDIA_OVERLAY = FIRST_SUB_WINDOW +4;
子窗口結束。( End of types of sub-windows )
public static final int LAST_SUB_WINDOW = 1999;
系統窗口。非應用程序創建。
public static final int FIRST_SYSTEM_WINDOW = 2000;
狀態欄。只能有一個狀態欄;它位於屏幕頂端,其他窗口都位於它下方。
public static final int TYPE_STATUS_BAR = FIRST_SYSTEM_WINDOW;
搜索欄。只能有一個搜索欄;它位於屏幕上方。
public static final int TYPE_SEARCH_BAR = FIRST_SYSTEM_WINDOW+1;
電話窗口。它用於電話交互(特別是呼入)。它置於所有應用程序之上,狀態欄之下。
public static final int TYPE_PHONE = FIRST_SYSTEM_WINDOW+2;
系統提示。它總是出現在應用程序窗口之上。
public static final int TYPE_SYSTEM_ALERT = FIRST_SYSTEM_WINDOW +3;
鎖屏窗口。
public static final int TYPE_KEYGUARD = FIRST_SYSTEM_WINDOW +4;
信息窗口。用於顯示toast。
public static final int TYPE_TOAST = FIRST_SYSTEM_WINDOW +5;
系統頂層窗口。顯示在其他一切內容之上。此窗口不能獲得輸入焦點,否則影響鎖屏。
public static final int TYPE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW +6;
電話優先,當鎖屏時顯示。此窗口不能獲得輸入焦點,否則影響鎖屏。
public static final int TYPE_PRIORITY_PHONE = FIRST_SYSTEM_WINDOW +7;
系統對話框。(例如音量調節框)。
public static final int TYPE_SYSTEM_DIALOG = FIRST_SYSTEM_WINDOW +8;
鎖屏時顯示的對話框。
public static final int TYPE_KEYGUARD_DIALOG = FIRST_SYSTEM_WINDOW +9;
系統內部錯誤提示,顯示於所有內容之上。
public static final int TYPE_SYSTEM_ERROR = FIRST_SYSTEM_WINDOW +10;
內部輸入法窗口,顯示於普通UI之上。應用程序可重新佈局以免被此窗口覆蓋。
public static final int TYPE_INPUT_METHOD = FIRST_SYSTEM_WINDOW +11;
內部輸入法對話框,顯示於當前輸入法窗口之上。
public static final int TYPE_INPUT_METHOD_DIALOG= FIRST_SYSTEM_WINDOW +12;
牆紙窗口。
public static final int TYPE_WALLPAPER = FIRST_SYSTEM_WINDOW +13;
狀態欄的滑動面板。
public static final int TYPE_STATUS_BAR_PANEL = FIRST_SYSTEM_WINDOW +14;
系統窗口結束。
public static final int LAST_SYSTEM_WINDOW = 2999;