我們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。拋棄掉 第二步,處理不能斷定為完全可見或完全不可見的線段,如...