做過window程式開發的朋友應該都知道,我們要把程式視窗置頂很簡單,只要設定一些視窗屬性即可。但是到了android,你無法簡單設定乙個屬性,就讓android的activity置頂。因為只要有新的activity啟動,你的activity介面就會被擋住。今天介紹一下如何把乙個視窗置頂。
也許會有人說:你的視窗置頂了,就會破壞系統的穩定性,影響其他程式使用,這是流氓行為o(╯□╰)o 。對於這個問題,如果你的頂層視窗沒有處理好,的確會有這個問題。不過對於一些定製系統來說,這個功能可以實現很有用的功能,例如:對於一些需要長時間提示使用者的危險警告。例如下面效果圖,在瀏覽的時候,系統彈出乙個警告框,會一直提示使用者注意安全,就算切換到其他程式,這個提示框也會一直在頂層。
(ps:新建的qq群,有興趣可以加入一起討論:android群:322599434)
1、windowmanager介紹
全部android的視窗機制是基於乙個叫做windowmanager實現,這個介面可以新增view到螢幕,也可以從螢幕刪除view。它面向的物件一端是螢幕,另一端就是view,直接忽視我們以前的activity或者dialog之類的元素。其實我們的activity或者diolog底層的實現也是經過windowmanager,windowmanager是全域性的,整個系統只有乙個windowmanager。它是顯示view的最底層了。
windowmanager主要用來管理視窗的一些狀態、屬性、view增加、刪除、更新、視窗順序、訊息收集和處理等。通過
context.getsystemservice(context.window_service)
的方式可以獲得
windowmanager
的例項.
windowmanager
繼承自viewmanager
,裡面涉及到視窗管理的三個重要方法,分別是
在windowmanager
中還有乙個重要的靜態類
layoutparams。
通過它可以設定和獲得當前視窗的一些屬性。我們先來看看addview()方法,在addview中,會利用layoutparams獲得window的view屬性,並為每個window創viewroot,viewroot是view和windowmanager之間的橋梁,真正把view傳遞給windowmanager的是通過viewroot的setview()方法,viewroot實現了view和windowmanager之間的訊息傳遞。在將主視窗新增到windowmanger時,它首先會建立乙個**物件:
wm=(windowmanagerimpl)context.getsystemservice(context.window_service)
並且開啟會話
(iwindowsession),
之後window
將通過該會話與
windowmanager
建立聯絡。
2、使用windowmanager實現浮動視窗
//edited by mythou上面是一段建立乙個浮動視窗的**,主要就是使用了windowmanager的addview方法,把我們建立的乙個view新增到windowmanager裡面去。除了使用上面的**動態建立乙個view,我們也可以直接載入某個xml檔案,然後生成乙個view,我們平常使用的xml布局檔案解析完,都是能生成乙個view物件,因此我們可以直接編寫乙個布局檔案然後使用layoutinflater來載入對應的view。例如下面的**://private
void
createfloatview()
return
true
; }
});wm.addview(btn_floatview,
params
); isadded = true
; }
//edited by mythou如果需要實現乙個全屏置頂的視窗,只要編寫乙個全屏的xml配置檔案即可,跟我們在activity裡面使用的xml配置介面一樣。//layoutinflater inflater = layoutinflater.from//載入需要的xml布局檔案relativelayout minview = (relativelayout)inflater.inflate(r.layout.in_vedio, null, false);//......
//新增到windowmanager裡面
wm.addview(btn_floatview, params);
3、注意事項
在使用windowmanager的時候有一點需要注意的是,你只能把父節點的view新增到windowmanager裡面,也就是說,你要新增的view不能是已經有父節點的某個子節點,否則會出現下面的問題:
4、結語
最後補充一點,不要輕易使用全屏置頂的方法,因為這個會影響你系統其它程式的執行。特別是你的view設定為透明和全屏置頂,會導致介面無法操作。
給出乙個浮動視窗的demo:
floating_window2013-8-7.rar
edited by mythou
Android之浮動小視窗
建立建立全域性變數類1 public 23 4 建立全域性變數 5 全域性變數一般都比較傾向於建立乙個單獨的資料類檔案,並使用static靜態變數6 789 10 11private windowmanager.layoutparams wmparams new windowmanager.layo...
類似flashget的浮動視窗的實現
類似flashget的浮動視窗的實現 得到位圖 cbitmap m bitmap hbitmap hbitmap m logo.getbitmap assert hbitmap 得到點陣圖的資訊 m bitmap.attach hbitmap bitmap bmp m bitmap.getbitma...
類似flashget的浮動視窗的實現
得到位圖 cbitmap m bitmap hbitmap hbitmap m logo.getbitmap assert hbitmap 得到點陣圖的資訊 m bitmap.attach hbitmap bitmap bmp m bitmap.getbitmap bmp 得到點陣圖的大小 int ...