教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Android培訓之WindowManager的使用(二)

更新時間:2016年07月13日17時02分 來源:Android培訓學院 瀏覽次數:

2. WindowManager使用詳解

2.1. 往屏幕上添加一個Window

調用WindowManager的addView方法即可。
private WindowManager mWindowManager;
private View mView;
private WindowManager.LayoutParams mParams;
private void addWindow() {
mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
mView = new TextView(getApplicationContext());
TextView tv = (TextView) mView;
tv.setText("我是Window中的View");
tv.setTextColor(Color.RED);
mParams = new WindowManager.LayoutParams();
// 設置寬高
mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
// 設置Window的背景支持半透明
mParams.format = PixelFormat.TRANSLUCENT;
mParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
mParams.type = WindowManager.LayoutParams.TYPE_TOAST;
// 設置Window的對齊方式,其實就是設置Window的坐標原點位置
mParams.gravity = Gravity.LEFT | Gravity.TOP;
// 設置Window的 x,y 坐標(相對于坐標原點)
mParams.x = 100;
mParams.y = 250;
// 設置Window標題,顯示在在 HierarchyView 透視圖中的 Windows面板里的名稱
mParams.setTitle("AddWindow");
// 往屏幕上添加一個Window,并且把第一個參數View放在Window中
mWindowManager.addView(mView,mParams);
}
顯示效果如下:
 

2.2. 代碼詳解

上面的代碼表示:調用 WindowManager的 addView(View view,WindowManager。LayoutParams lp) 方法,往屏幕上添加一個Window,這個Window中顯示的內容為第一個參數設置的View,Window的顯示位置以及其他屬性由第二個參數 WindowManager。LayoutParams指定。
這個方法很簡單,但是 WindowManager。LayoutParams 中有兩個字段比較重要,這里詳細說一下。
1.flags
用來控制Window的顯示特性,有很多可取的值,不同的的值表示不同的顯示特性, 如果希望Window具有多個值的特性, 可以使用 “|” 將這些值進行按位或運算。這里介紹幾個比較常用的取值:
FLAG_NOT_TOUCHABLE Window不接收觸摸事件
FLAG_NOT_FOCUSABLE Window不獲取焦點,即不能接收按鍵事件,按鍵事件傳遞給下層具有焦點的Window
FLAG_NOT_TOUCH_MODAL 表示系統(tǒng)會將當前Window區(qū)域外的任何事件傳遞給底層的Window,當前Window區(qū)域內的事件自己處理,一般來說,都需要開啟此標記,否則其他Window無法獲取事件. 當設置了FLAG_NOT_FOCUSABLE后,此標記也會自動設置
FLAG_KEEP_SCREEN_ON Window顯示期間,保持屏幕高亮
2.type
用來表示Window的類型,Window有三種大的類型,分別是應用Window,子Window和系統(tǒng)Window。Activity的Window就是一種應用Window,Dialog的Window是一種子Window,子Window不能單獨存在,必須附屬在特定的父Window中,這也就是為什么Dialog的Context必須是Activity。系統(tǒng)Window大都是(不是全部)需要聲明權限才能創(chuàng)建,獨立應用Window之外,比如Toast,狀態(tài)欄等等。
Window是分層的,層級大的會覆蓋在層級小的之上,三大類Window中,應用Window層級范圍是1-99,子Window是1000-1999,系統(tǒng)Window是2000-2999,這就是為什么Dialog顯示在Activity之上,而Toast又可以顯示在Dialog之上。如圖:
 
type這個字段的取值有很多,不同的值表示不同的層級范圍,具體可以看文檔,一般來說,如果這個取值為系統(tǒng)Window層級范圍內的值,則需要聲明權限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
另外,type會影響flags的效果,比如,如果type設置為 TYPE_TOAST,則無論怎樣設置flags,這個Window都無法接收觸摸事件。

2.3. 查看屏幕上的Window

我們再往屏幕上加一個PopupWindow和一個Dialog,當前界面如下:

在Eclipse中,點擊菜單 Window - Open Perspective - Others,選擇 HierarchyView,打開,選擇Windows面板,可以看到當前屏幕中所有的Window:

我們添加的Window在其中顯示的標題為AddWindow,另外,我們可以看到還有別的幾個Window,比如 PopupWindow,MainActivity,加粗的那一個其實是MainActivity中彈出的Dialog,還能看到 StatusBar(狀態(tài)欄),RecentsPanel(最近應用列表)等等,這也證明了我們前面說的,Android中所有的界面都是顯示在Window中的。

本文版權歸傳智播客Android培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:傳智播客Android培訓學院
首發(fā):http://fskzgqt.cn/Android
0 分享到:
和我們在線交談!