2016-04-18 22 views
1

全画面オーバーレイを描画するアプリを作成しています。ロックスクリーンのようなもの。ユーザーはタイマーを設定し、時間が来たらこのオーバーレイが表示されます。ナビゲーションバーの裏側または上にオーバーレイを描画

しかし、オーバーレイはシステムナビゲーションバーをカバーしません。ナビゲーションバーが半透明のときは問題です。ユーザーはシステムボタンに触れることができ、それらの背後にある変更可能な背景を見ることができます。したがって、ユーザーはロック画面の背後に何かを見ることができます。それは問題だ。 どうすればこのような状況を防ぐことができますか?

ロック画面オーバーレイはアクティビティではありません。ユーザーはタイマーを設定し、自分のデバイスを自由に閲覧できます。時間が来るとアプリは、次のように、画面上のいくつかのビューを描画します:私は仮定

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

View overlayView = new OverlayView(this); 

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

は、あなたがフルスクリーンとしてオーバーレイビューをホストする活動をしたいよ君の場合システムバーをカバーしたい。

次のようなコードです。

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); 
    } 
} 

あなたのアクティビティにはシステムバーが表示されず、画面の一番上まで見ることができます。

EDIT:あなたの最後のコメントからは、ここで私はそれを行うだろう方法は次のとおりです。

ステップ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'を使うべきではありませんか?しかし、私はこのアクティビティをどのようにオーバーレイとして設定できますか?このアクティビティの閉鎖を防ぐにはどうすればよいですか?ユーザーがロックを解除しないうちに閉じられないLockscreenである必要があります。 – user2775914

関連する問題