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

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

Android培訓(xùn)之WindowManager的使用(一)

更新時(shí)間:2016年07月26日10時(shí)33分 來源:傳智播客Android培訓(xùn)學(xué)院 瀏覽次數(shù):

1. WindowManager,Window的介紹

1.1. Window


Window表示一個(gè)窗口。對于Android里的Window,我們可以類比Windows系統(tǒng)中的Window,在Windows中,每打開一個(gè)軟件,都會彈出一個(gè)窗口,這個(gè)窗口右上角有最小化,最大化,關(guān)閉按鈕,做了某些操作時(shí),也可能會彈出一個(gè)窗口,下面可能會有確定,取消之類的按鈕,這些都是Windows系統(tǒng)中的窗口。如圖所示:
在Android里,也有Window的概念,但是Android里的Window沒有邊框, 也沒有最大最小關(guān)閉按鈕的。如圖所示:
Android中所有的界面都是顯示在一個(gè)個(gè)Window中的,包括Activity,Dialog,Toast,甚至狀態(tài)欄,最近應(yīng)用列表,都是在Window中顯示的。只是我們看不到這些Window的邊框,只能看到里面的內(nèi)容。其實(shí) Window并不能真正的顯示內(nèi)容,它只是一個(gè)虛擬的"框",真正能顯示內(nèi)容的是View。Window是View的直接管理者,觸摸事件也是先由Window接收,然后傳遞給View的。
Window是一個(gè)抽象類,在Android手機(jī)中,Window的實(shí)現(xiàn)類是PhoneWindow。

1.2. WindowManager

WindowManager是Window的管理者,對應(yīng)著系統(tǒng)底層的一個(gè)服務(wù):WindowManagerService。
我們無法直接訪問Window,要操作Window,必須通過WindowManager。WindowManager有三個(gè)常用方法:addView,removeView,updateViewLayout我們可以通過WindowManager往屏幕上添加/刪除一個(gè)Window,或者通過它修改一個(gè)Window的布局參數(shù)。
WindowManager是一個(gè)接口,在Android中,WindowManager的實(shí)現(xiàn)類WindowManagerImpl。

2. WindowManager使用詳解

2.1. 往屏幕上添加一個(gè)Window

調(diào)用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();
// 設(shè)置寬高
mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
// 設(shè)置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;
// 設(shè)置Window的對齊方式,其實(shí)就是設(shè)置Window的坐標(biāo)原點(diǎn)位置
mParams.gravity = Gravity.LEFT | Gravity.TOP;
// 設(shè)置Window的 x,y 坐標(biāo)(相對于坐標(biāo)原點(diǎn))
mParams.x = 100;
mParams.y = 250;
// 設(shè)置Window標(biāo)題,顯示在在 HierarchyView 透視圖中的 Windows面板里的名稱
mParams.setTitle("AddWindow");
// 往屏幕上添加一個(gè)Window,并且把第一個(gè)參數(shù)View放在Window中
mWindowManager.addView(mView,mParams);
}
顯示效果如下:

2.2. 代碼詳解

上面的代碼表示:調(diào)用 WindowManager的 addView(View view,WindowManager。LayoutParams lp) 方法,往屏幕上添加一個(gè)Window,這個(gè)Window中顯示的內(nèi)容為第一個(gè)參數(shù)設(shè)置的View,Window的顯示位置以及其他屬性由第二個(gè)參數(shù) WindowManager。LayoutParams指定。
這個(gè)方法很簡單,但是 WindowManager。LayoutParams 中有兩個(gè)字段比較重要,這里詳細(xì)說一下。
1.flags
用來控制Window的顯示特性,有很多可取的值,不同的的值表示不同的顯示特性, 如果希望Window具有多個(gè)值的特性, 可以使用 “|” 將這些值進(jìn)行按位或運(yùn)算。這里介紹幾個(gè)比較常用的取值:

FLAG_NOT_TOUCHABLE Window不接收觸摸事件
FLAG_NOT_FOCUSABLE Window不獲取焦點(diǎn),即不能接收按鍵事件,按鍵事件傳遞給下層具有焦點(diǎn)的Window
FLAG_NOT_TOUCH_MODAL 表示系統(tǒng)會將當(dāng)前Window區(qū)域外的任何事件傳遞給底層的Window,當(dāng)前Window區(qū)域內(nèi)的事件自己處理,一般來說,都需要開啟此標(biāo)記,否則其他Window無法獲取事件. 當(dāng)設(shè)置了FLAG_NOT_FOCUSABLE后,此標(biāo)記也會自動設(shè)置
FLAG_KEEP_SCREEN_ON Window顯示期間,保持屏幕高亮
2.type
用來表示W(wǎng)indow的類型,Window有三種大的類型,分別是應(yīng)用Window,子Window和系統(tǒng)Window。Activity的Window就是一種應(yīng)用Window,Dialog的Window是一種子Window,子Window不能單獨(dú)存在,必須附屬在特定的父Window中,這也就是為什么Dialog的Context必須是Activity。系統(tǒng)Window大都是(不是全部)需要聲明權(quán)限才能創(chuàng)建,獨(dú)立應(yīng)用Window之外,比如Toast,狀態(tài)欄等等。
Window是分層的,層級大的會覆蓋在層級小的之上,三大類Window中,應(yīng)用Window層級范圍是1-99,子Window是1000-1999,系統(tǒng)Window是2000-2999,這就是為什么Dialog顯示在Activity之上,而Toast又可以顯示在Dialog之上。如圖:

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