2016-04-18 19 views
1

我正在創建應繪製全屏疊加層的應用程序。像鎖屏一樣。用戶設置了一些計時器,當時間到了時,應該出現這個覆蓋圖。在導航欄後面或上方繪製疊加層

但覆蓋不包括系統導航欄。當導航欄是半透明時,這是個問題。用戶可以觸摸系統按鈕,並可以看到他們身後的一些可變背景。因此用戶可以看到鎖定屏幕後面的內容。這是一個問題。 我怎麼能防止這種情況?

請注意,鎖定屏幕疊加層不是活動。用戶設置計時器並可以自由瀏覽他的設備。在時機成熟時應用得出一些觀點在屏幕上,就像這樣:

View overlayView = new OverlayView(this); 

windowManager.addView(overlayView, OverlayView.createLayoutParams(retrieveScreenHeight())); 

其中

public OverlayView(Context context) { 
    super(context); 
    inflate(context, R.layout.overlay_view, this); 
} 


static WindowManager.LayoutParams createLayoutParams(int height) { 
    final WindowManager.LayoutParams params = 
      new WindowManager.LayoutParams(MATCH_PARENT, height, TYPE_SYSTEM_ERROR, 
         FLAG_NOT_FOCUSABLE 
        | FLAG_LAYOUT_IN_SCREEN 
        | FLAG_LAYOUT_NO_LIMITS 
        | FLAG_NOT_TOUCH_MODAL 
        | FLAG_LAYOUT_INSET_DECOR 
        | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION 
        , TRANSLUCENT); 
    params.gravity = Gravity.TOP; 

    return params; 
} 


public int retrieveScreenHeight() { 
    int result = 0; 

    WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE); 

    Point outSize = new Point(); 
    wm.getDefaultDisplay().getSize(outSize); 
    if(outSize.y > outSize.x){ 
     result = outSize.y; 
    }else{ 
     result = outSize.x; 
    } 

    return result; 
} 

回答

0

我想你會希望承載覆蓋視圖全屏的活動,如果你想要覆蓋系統欄。

類似下面的代碼。

public class ActivityName extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // remove title 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
     WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.main); 
    } 
} 

然後您的活動將不會顯示系統欄,並且您將使您的視圖一路走到屏幕的頂部。

編輯:從你最後的評論,這裏就是我會做它:

第1步:創建一個該FullScreenLockActivity:

public class FullScreenLockActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // remove title 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     // set to fullScreen 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
     WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     //Load your black semi-transparent view 
     setContentView(R.layout.lock_screen); 
    } 

    //Override this to prevent the user to close this activity by pressing the back button 
    @Override 
    public void onBackPressed() {} 

} 

2步:實現在FullScreenLockActivity你的 「屏幕解鎖」 行爲

步驟3:向顯示在鎖定屏幕,呼叫

Intent i = new Intent(yourCurrentActivity.this, FullScreenLockActivity.class); 
startActivity(i); 
+0

感謝您的回答。我應該注意到疊加視圖不是一個活動。這只是一個「視圖」。無論屏幕上有什麼內容,我都可以在任何時候使用'windowManager.addView'來繪製它。屏幕上可能是當時的任何其他應用程序。 – user2775914

+0

然後,最簡單的方法是將該視圖作爲「虛擬活動」的一部分,全屏並將視圖作爲背景。 這樣,您仍然可以看到背後是什麼(因爲疊加層是半透明的),並且您從全屏標誌中受益。 – NSimon

+0

你的意思是,當時間到了,應用程序應該彈出這個全屏「虛擬活動」?我不應該使用'windowManager.addView'呢?但是,我怎麼能將這個活動設置爲覆蓋?我如何防止關閉此活動?它應該是鎖屏,在用戶無法解鎖的情況下無法關閉。 – user2775914