2011-06-16 106 views
10

我目前很難在全屏模式下顯示TYPE_SYSTEM_ALERT窗口。我想這樣做是爲了在服務器上創建一個疊加視圖,並且不隱藏它。如何顯示全屏TYPE_SYSTEM_ALERT窗口?

但是,將FLAG_FULLSCREEN標誌放入我創建的窗口的佈局參數中似乎不起作用。我找到了STATUS_BAR和EXPAND_STATUS_BAR權限,但我找不到如何使用它們。

這裏是的LayoutParams:

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
      WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      PixelFormat.TRANSLUCENT); 

    params.gravity = Gravity.RIGHT | Gravity.TOP; 

    mWindowManager.addView(mOverlayView, params); 

任何想法?

謝謝

+0

我一直在使用類似的技術來渲染任何應用程序中的畫中畫視頻流。但是,使用您的方法創建的View的更新率似乎與其下方的視圖的更新率相關聯。你知道是否有辦法解耦更新速率並最大化透明覆蓋的更新速率? – user48956 2012-01-19 01:22:00

回答

17

我在嘗試做別的事情時發現瞭解決方案!

爲了對所有其他窗口的頂部,並在狀態欄的頂部TYPE_SYSTEM_ALERT窗口中,您必須添加FLAG_LAYOUT_IN_SCREEN標誌,而不是FLAG_LAYOUT_FULLSCREEN標誌:

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
     WindowManager.LayoutParams.WRAP_CONTENT, 
     WindowManager.LayoutParams.WRAP_CONTENT, 
     WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
     WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
     WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, 
     PixelFormat.TRANSLUCENT); 

mWindowManager.addView(mOverlayView, params); 
+1

狀態欄仍然可以被拉下。我將PixelFormat更改爲OPAQUE,這樣我就可以看到新的視圖,它覆蓋了狀態欄,但是當我從屏幕頂部向下滑動時,狀態仍會展開並且可點擊。有任何想法嗎? – MindWire 2011-12-08 14:44:41

+0

非常有幫助!我一直在尋找一種方法來創建一個模擬光標,就像在Windows Mobile上一樣,並感謝您的幫助,我擁有它 – radhoo 2012-04-27 13:52:03

+1

適用於狀態欄。任何想法如何使它在導航欄的頂部呢? – AnAurelian 2015-09-12 14:34:17

4

它不工作了的冰淇淋三明治。狀態欄包含一個TYPE_SYSTEM_ALERT窗口。但TYPE_SYSTEM_OVERLAY仍然正常工作。

+1

哦,這是一個問題,因爲OVERLAY不以同樣的方式接受MotionEvents,只有WATCH_TOUCH_OUTSIDE標誌,所有事件都會有ACTION_OUTSIDE的操作。 – Tom 2012-02-23 15:42:04