Window和WindowManage

Window表示是一個窗口的概念贸典,它是一個抽象類凤粗,具體的實現(xiàn)是PhoneWindow纠炮,創(chuàng)建一個Window是很簡單的事,只需要通過WindowManager就可以完成杨幼,Android中所有的視圖都是通過Window來實現(xiàn)的撇簿,比如Activity,Toast和Dialog差购,當(dāng)我們需要做懸浮窗口的需求的時候四瘫,就需要用到它們,下面來看看


Window和WindowManager

先來看看如何通過WindowManager添加一個Window

        Button button=new Button(this);
        WindowManager wmManager=(WindowManager) getSystemService(Context.WINDOW_SERVICE);
        WindowManager.LayoutParams lp=new WindowManager.LayoutParams();
        lp.flags= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                |WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
        lp.gravity= Gravity.TOP;
        lp.x=100;
        lp.y=300;
        wmManager.addView(button,lp);

代碼很簡單欲逃,創(chuàng)建一個view之后就可以用WindowManager的addView方法引用到屏幕x=100和y=300坐標(biāo)上了找蜜,其實WindowManager常用的方法就是添加view,更新view和刪除view稳析,也就是addView洗做,updateViewLayout和removeView

(一)Flags

參數(shù)表示W(wǎng)indow的屬性弓叛,它有很多選項,通過這些選項可以控制Window的顯示特性

FLAG_NOT_FOCUSABLE

表示window不需要獲取焦點诚纸,這個比較好理解撰筷,設(shè)置了這個屬性后,window將不會獲取到焦點

FLAG_NOT_TOUCH_MODAL

在此模式下畦徘,系統(tǒng)會將當(dāng)前Window區(qū)域以外的單擊事件傳遞給底層的Window毕籽,當(dāng)前Window區(qū)域以內(nèi)的單擊事件則自己處理。 一般來說都需要開啟此標(biāo)記井辆,否則其他Window將無法收到單擊事件

FLAG_SHOW_WHEN_LOCKED

此模式可以讓W(xué)indow顯示在鎖屏的界面上


(二)Type

Type代表的是window的類型关筒,共有3種,分別是:應(yīng)用window杯缺,子window和系統(tǒng)window蒸播,應(yīng)用window對應(yīng)一個Activity,子window需要依附在父window上夺谁,不能單獨存在廉赔,比如dialog肉微,系統(tǒng)window就是系統(tǒng)提供的匾鸥,比如toast,狀態(tài)欄等碉纳,這些在使用的時候需要聲明權(quán)限勿负,否則報錯,每一類型的window都有一個范圍

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 
應(yīng)用window(1-99):Activity劳曹,F(xiàn)ragment等
子window(1000-1999):Dialog奴愉,Popupwindow等
系統(tǒng)window(2000-2999):Toast,狀態(tài)欄铁孵,通知等

層級范圍對應(yīng)這WindowManager.LayoutParams的type參數(shù)锭硼,層級大的會覆蓋在層級小的Window上面。所以系統(tǒng)層級是最大的蜕劝,系統(tǒng)層級一般選用TYPE_SYSTEM_ERROR或者TYPE_SYSTEM_OVERLAY


上面提到了windowManger對view的操作有addView檀头,updateViewLayout和removeView,這3個方法定義在ViewManager中岖沛,而WindowManger是繼承了ViewManager暑始,我們來看看這三個方法:

public interface ViewManager  
{  
    /** 
     * Assign the passed LayoutParams to the passed View and add the view to the window. 
     * <p>Throws {@link android.view.WindowManager.BadTokenException} for certain programming 
     * errors, such as adding a second view to a window without removing the first view. 
     * <p>Throws {@link android.view.WindowManager.InvalidDisplayException} if the window is on a 
     * secondary {@link Display} and the specified display can't be found 
     * (see {@link android.app.Presentation}). 
     * @param view The view to be added to this window. 
     * @param params The LayoutParams to assign to view. 
     */  
    public void addView(View view, ViewGroup.LayoutParams params);  
    public void updateViewLayout(View view, ViewGroup.LayoutParams params);  
    public void removeView(View view);  
}  

這3個功能足夠我們平常用了,其實WindowManager操作Window的過程就好像Window操作view的過程婴削,我們有時候看到那些可以拖動Window的效果廊镜,其實就可以通過updateViewLayout來實現(xiàn),設(shè)置view的onTouchListener唉俗,然后根據(jù)手指拖動來改變x和y的值嗤朴,不斷更新view就可以了

 button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int x = (int) event.getRawX();
                int y= (int) event.getRawY();
                switch (event.getAction()){
                    case MotionEvent.ACTION_MOVE:
                        lp.x=x;
                        lp.y=y;
                        wmManager.updateViewLayout(button,lp);
                        break;
                }
                return false;
            }
        });

好了配椭,這篇文章到這就結(jié)束了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市播赁,隨后出現(xiàn)的幾起案子颂郎,更是在濱河造成了極大的恐慌,老刑警劉巖容为,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乓序,死亡現(xiàn)場離奇詭異,居然都是意外死亡坎背,警方通過查閱死者的電腦和手機替劈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來得滤,“玉大人陨献,你說我怎么就攤上這事《” “怎么了眨业?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沮协。 經(jīng)常有香客問我龄捡,道長,這世上最難降的妖魔是什么慷暂? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任聘殖,我火速辦了婚禮,結(jié)果婚禮上行瑞,老公的妹妹穿的比我還像新娘奸腺。我一直安慰自己,他們只是感情好血久,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布突照。 她就那樣靜靜地躺著,像睡著了一般氧吐。 火紅的嫁衣襯著肌膚如雪讹蘑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天副砍,我揣著相機與錄音衔肢,去河邊找鬼。 笑死豁翎,一個胖子當(dāng)著我的面吹牛角骤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼邦尊,長吁一口氣:“原來是場噩夢啊……” “哼背桐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蝉揍,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤链峭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后又沾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弊仪,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年杖刷,在試婚紗的時候發(fā)現(xiàn)自己被綠了励饵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡滑燃,死狀恐怖役听,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情表窘,我是刑警寧澤典予,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站乐严,受9級特大地震影響瘤袖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜麦备,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一孽椰、第九天 我趴在偏房一處隱蔽的房頂上張望昭娩。 院中可真熱鬧凛篙,春花似錦、人聲如沸栏渺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽磕诊。三九已至填物,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間霎终,已是汗流浹背滞磺。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留莱褒,地道東北人击困。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像广凸,于是被迫代替她去往敵國和親阅茶。 傳聞我的和親對象是個殘疾皇子蛛枚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容