1. ホーム
  2. android

[解決済み] Lollipop : ステータスバーの背後に描画し、その色を透明に設定する。

2022-04-28 15:20:37

質問

ロリポップ用にステータスバーの色を透明に設定しました。

<item name="android:statusBarColor">@android:color/transparent</item>

さて、その後ろに描画する必要があるのですが、どのビューも後ろに描画することができません。を使って行う方法は知っています。 windowTranslucentStatus プロパティがありますが、このプロパティを使用すると、statusBarの色がtransparentに設定されていることを無視してしまうので、使用したくありません。

解決方法は?

方法その1。

完全に透明なステータスバーを実現するためには statusBarColor これは、API 21 以上で利用可能です。 windowTranslucentStatus はAPI 19以降で利用可能ですが、ステータスバーに色付きの背景が追加されます。ただし windowTranslucentStatus を変更することで、1つのことが実現できます。 statusBarColor を透明にすることはできません。 SYSTEM_UI_FLAG_LAYOUT_STABLESYSTEM_UI_FLAG_LAYOUT_FULLSCREEN フラグを使用します。同じ効果を得る最も簡単な方法は、これらのフラグを手動で設定することです。これは、Androidレイアウトシステムが課すインセットを効果的に無効にし、自分自身で対処できるようにします。

この行は onCreate メソッドを使用します。

getWindow().getDecorView().setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

また、/res/values-v21/styles.xmlで透明度を必ず設定してください。

<item name="android:statusBarColor">@android:color/transparent</item>

または、プログラムで透明度を設定する。

getWindow().setStatusBarColor(Color.TRANSPARENT);

この方法の良い点は、透明なステータスバーを半透明な色調のステータスバーに置き換えることで、API 19でも同じレイアウトとデザインを使用できることです。

<item name="android:windowTranslucentStatus">true</item>

方法その2。

ステータスバーの背後にビューを配置するのではなく、ステータスバーの下に背景画像を描くだけでよい場合は、方法1のように、アクティビティのテーマの背景を希望の画像に設定し、ステータスバーの透明度を設定するだけで実現できます。のスクリーンショットを作成するために使用した方法です。 Android Policeの記事 数ヶ月前のものです。

方法その3。

あるレイアウトでは標準のシステムインセットを無視し、他のレイアウトでは動作させなければならない場合、唯一の実行可能な方法は、しばしばリンクされている ScrimInsetsFrameLayout クラスがあります。もちろん、そのクラスで行われていることのいくつかは、すべてのシナリオで必要なことではありません。たとえば、合成ステータス・バー・オーバーレイを使用する予定がない場合は、単に init() メソッドを使用し、attrs.xml ファイルに何も追加する必要はありません。私はこの方法がうまくいくのを見たことがありますが、回避するために多くの作業を必要とする可能性がある他の意味をもたらすことが分かると思います。

また、複数のレイアウトをラップすることに反対されているとお見受けしました。あるレイアウトを別のレイアウトの内側でラップする場合、両方のレイアウトに match_parent の高さと幅のために、パフォーマンスへの影響は心配するにはあまりに些細です。とはいえ、このクラスが継承しているクラスを FrameLayout を好きなタイプのLayoutクラスに変更してください。これで問題なく動作します。