用WindowManager直接顯示View

2021-08-26 12:55:27 字數 1761 閱讀 1636

我們android平台是乙個又乙個的activity組成的,每乙個activity有乙個或者多個view構成。所以說,當我們想顯示乙個介面的時候,我們首先想到的是建立乙個activity,然後所有的操作在activity裡面實現,或者是乙個dialog或者toast。這種方式固然簡單,但是在有些情況下,我們要求的只是簡單的顯示,用activity顯然是多餘,這個時候,我們如何處理呢?

原來,整個

android

的視窗機制是基於乙個叫做

windowmanager

,這個介面可以新增

view

到螢幕,也可以從螢幕刪除

view

。它面向的物件一端是螢幕,另一端就是

view

,直接忽略我們以前的activity或者dialog之類的東東。其實我們的

activity

或者diolog

底層的實現也是通過

windowmanager

,這個windowmanager

是全域性的,整個系統就是這個唯一的東東。它是顯示

view

的最底層了。

寫乙個簡單的**:

示例1:

windowmanager wm=null;

view rootview;

public void showwindow()

};btn.setonclicklistener(listener);

rootview=btn; }

windowmanager.layoutparams params = new windowmanager.layoutparams();

params.width=400;

params.height=100;

/*@1params.flags |=(windowmanager.layoutparams.flag_not_touchable

|windowmanager.layoutparams.flag_not_focusable); */

//@2params.flags|=windowmanager.layoutparams.flag_split_touch;

wm.addview(rootview, params); }

public void romovewindow()

我們這個button的顯示和當前的執行環境基本上是無關的,當前是什麼

activity

或者是桌面

,使用windowmanager

可以給你的程式設計帶來很大的靈活性,但是要注意,顯示出來就要銷毀掉,這個是必須的,銷毀其實就是乙個remove。

注意:預設的話,view顯示在最上層,但是後面的

view

無法獲得焦點,當你touch的座標超出你的view的範圍時,它還是把touch事件傳送到它。在

android sdk3.0

之前的話,沒有很好的處理方式。只有採用

@1處的**,讓你的

view

不能獲得焦點,不能處理觸控螢幕事件,不能接收按鍵事件及其他按鈕事件,這樣它後面的

view

才能獲得焦點,才能接收觸控螢幕事件,按鍵事件及其他按鈕事件。在

android sdk3.0

之後,才支援

slipt touch

的處理。這時你可以採用

@2處的**。

關於windowmanager.layoutparamswindowmanager.layoutparams

WindowManager獲取寬和高

實現implements viewmanager介面 內部類windowmanager.layoutparams 自有方法 abstract display getdefaultdisplay 對應display的用法 void getcurrentsizerange point outsmalle...

WindowManager實現懸浮可拖動效果

現在360手機衛士有個流量統計的效果,開啟流量統計後,在桌面上會出現乙個顯示流量的窗體,在任何介面都可以自由拖動。模仿這個功能,做了乙個統計手機訊號強度的demo,介面效果如下 從上面的截圖可以看出,當開啟手機訊號懸浮框後,預設在右上角會出現乙個小窗體 乙個圖示加上乙個訊號強度 這個窗體附在鎖屏上 ...

在OpenCV裡用clipLine裁剪直線段

如果你學習過圖形學,就會對這個裁剪演算法有深入的了解,比如sutherland cohen演算法大體的意思如下 第一步,判定 1 完全在視窗內的直線段,稱為完全可見的線段,如ab。保留著 2 完全在視窗外的線段,稱為完全不可見線段,如cd。拋棄掉 第二步,處理不能斷定為完全可見或完全不可見的線段,如...