Android 實現頂層視窗 浮動視窗

2021-07-26 04:47:08 字數 2845 閱讀 3426

做過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

//private

void

createfloatview()

return

true

; }

});wm.addview(btn_floatview,

params

); isadded = true

; }

上面是一段建立乙個浮動視窗的**,主要就是使用了windowmanager的addview方法,把我們建立的乙個view新增到windowmanager裡面去。除了使用上面的**動態建立乙個view,我們也可以直接載入某個xml檔案,然後生成乙個view,我們平常使用的xml布局檔案解析完,都是能生成乙個view物件,因此我們可以直接編寫乙個布局檔案然後使用layoutinflater來載入對應的view。例如下面的**:

//edited by mythou

//layoutinflater inflater = layoutinflater.from//載入需要的xml布局檔案relativelayout minview = (relativelayout)inflater.inflate(r.layout.in_vedio, null, false);//......

//新增到windowmanager裡面

wm.addview(btn_floatview, params);

如果需要實現乙個全屏置頂的視窗,只要編寫乙個全屏的xml配置檔案即可,跟我們在activity裡面使用的xml配置介面一樣。 

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 ...