android中Activity中的WindowManager與Window


在做項目的過程中,需要實現Activity非全屏顯示、窗口背景透明顯示的效果。

在實現這些功能的過程中,涉及到Window與WindowManager兩個類,經過查一些相關資料,了解二者之間的不同點如下所示:

1)WindowManager繼承自ViewManager這個接口,這個接口主要有以下的實現子接口:

       * addView();  
       * updateViewLayout(); 
       * removeView();

        在WindowManager中,addView方法表示的是將主窗口中的頂級view(也就是DecorView)添加到WindowManager中,並建立會話。

  WindowManager主要用來管理窗口的一些狀態、屬性、view增加、刪除、更新、窗口順序、消息收集和處理等。

2)接下來會詳細介紹。我們先來看看Window

  Window是android中的窗口,表示頂級窗口的意思,也就是主窗口,它有兩個實現類,PhoneWindow和MidWindow,我們一般的 activity對應的主要是PhoneWindow,在activity中經常使用的setContentView等方法也是在這個里面實現的。

3)每個主窗口中都有一個View,稱之為DecorView,是主窗口中的頂級view(實際上就是ViewGroup),在View中有兩個成員變量叫做 mParent、mChildren,它是用來管理view的上下級關系的。而ViewGroup是對一組View的管理。因此,在ViewGroup中 建立了所有view的關系網。而最終ViewGroup附屬在主窗口上。這樣就很容易在窗口中通過findViewById找到具體的View了。 view中的事件處理也是根據這個路徑來處理的。

 1 wm = (WindowManager)getSystemService("window");
 2          WindowManager.LayoutParams params = new WindowManager.LayoutParams();
 3          params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT | WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
 4          params.format = PixelFormat.TRANSPARENT;
 5          params.alpha = 0.0f;
 6          params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
 7                  WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
 8          params.width = ConnTeckConstant.screenWidth  ;
 9          params.height = ConnTeckConstant.screenHeight ;
10          params.x = 0;
11          params.y = 0;
12          wm.addView(playView, params);  //此句非常關鍵,若沒有此句,則窗口不會顯示,即使在window接口中調用setContentView,也不會顯示。params用於設置view所在頂級窗口的屬性
13         
14          configSurface();
15          configSurface2();
16         
17          WindowManager.LayoutParams params2 = new WindowManager.LayoutParams();
18          params2.width =  params.width;
19          params2.height = params.height ;//此句用於自定義窗口大小,實現Activity窗口非全屏顯示
20          params2.alpha = (float)0.0;//此句用於定義窗口透明顯示
21         
22          window = this.getWindow();
23          window.setAttributes(params2);//params2用於設備整個Activity的窗口屬性

4、浮動窗口實現

     窗口樣式定義:

    

 1 wm=(WindowManager)getApplicationContext().getSystemService("window");
 2             //設置LayoutParams(全局變量)相關參數
 3             wmParams = ((MyApplication)getApplication()).getMywmParams();
 4 
 5              /**
 6              *以下都是WindowManager.LayoutParams的相關屬性
 7              * 具體用途可參考SDK文檔
 8              */
 9             wmParams.type=LayoutParams.TYPE_PHONE;   //設置window type
10             wmParams.format=PixelFormat.RGBA_8888;   //設置圖片格式,效果為背景透明
11 
12             //設置Window flag
13             wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
14                                   | LayoutParams.FLAG_NOT_FOCUSABLE;
15             /*
16              * 下面的flags屬性的效果形同“鎖定”。
17              * 懸浮窗不可觸摸,不接受任何事件,同時不影響后面的事件響應。
18              wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL 
19                                    | LayoutParams.FLAG_NOT_FOCUSABLE
20                                    | LayoutParams.FLAG_NOT_TOUCHABLE;
21             */
22             
23             
24             wmParams.gravity=Gravity.LEFT|Gravity.TOP;   //調整懸浮窗口至左上角
25             //以屏幕左上角為原點,設置x、y初始值
26             wmParams.x=0;
27             wmParams.y=0;
28             
29             //設置懸浮窗口長寬數據
30             wmParams.width=40;
31             wmParams.height=40;
32         
33             //顯示myFloatView圖像
34             wm.addView(myFV, wmParams);

     這個浮動窗口的實現是其於一個完整的Activity中彈出一個浮動窗口實現的,若希望整個Activity本身就是一個浮動窗口,則需要修改Window的屬性

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM