Android OSについて知りたいのですが、Google I/O 2014アプリを読んでいるときにWindowInsets
に出会いました。その人が誰であるかを説明できる場合それは大きな助けになるでしょう。
ここでは WindowInsetsについてすべて学ぶことができます。WindowInsets
は、アプリケーションで使用できるウィンドウ上の領域を提供します。それ自体はあまり役に立ちません。 View.onApplyWindowInsets
をオーバーライドするか、View.OnApplyWindowInsetsListener
を実装することが、本当の目的です。あなたはそれらについてここで読むことができます: View.onApplyWindowInsets と View.OnApplyWindowInsetsListener
カスタムの方法でビューにウィンドウインセットを適用するためのリスナー。
アプリは、ビューのウィンドウインセットの処理方法にカスタムポリシーを適用する場合、このインターフェイスを実装することを選択できます。 OnApplyWindowInsetsListenerが設定されている場合、ビュー自体のonApplyWindowInsetsメソッドの代わりに、そのonApplyWindowInsetsメソッドが呼び出されます。リスナーはオプションで、パラメータービューのonApplyWindowInsetsメソッドを呼び出して、ビューの通常の動作を自身の一部として適用できます。
つまり、これをオーバーライドすると、ビューで使用できるウィンドウの領域を制御できます。
WindowInsets
は、ウィンドウに適用されるシステムビュー(ステータスバー、ナビゲーションバーなど)のインセット(またはサイズ)です。
具体例でわかりやすいと思います。このシナリオをイメージします。
WindowInsets
がステータスバーの高さで埋め込まれるため、ImageView
を背景ImageView
に適用したくありません。
ただし、インセットをToolbar
に適用する必要があります。そうしないと、Toolbar
がステータスバーの中央に描画されるためです。
ビューはWindowInsets
をxmlに適用したいという要望を次のように宣言します。
Android:fitsSystemWindows="true"
この例では、ルートレイアウトがWindowInsets
を消費し、WindowInsets
が埋め込まれるため、ImageView
をルートレイアウトに適用できません。
代わりに、ViewCompat.setOnApplyWindowInsetsListener
を使用して、ツールバーにインセットを適用できます。
ViewCompat.setOnApplyWindowInsetsListener(toolbar, (v, insets) -> {
((ViewGroup.MarginLayoutParams) v.getLayoutParams()).topMargin =
insets.getSystemWindowInsetTop();
return insets.consumeSystemWindowInsets();
});
Toolbar
のルートレイアウトがその子にWindowsInsets
を渡すと、このコールバックが呼び出されることに注意してください。 FrameLayout
、LinearLayout
、DrawerLayout
、CoordinatorLayout
のようなレイアウト。
レイアウトをサブクラス化できます。 FrameLayout
およびオーバーライドonApplyWindowInsets
:
@TargetApi(Build.VERSION_CODES.KitKat_WATCH)
@Override
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
int childCount = getChildCount();
for (int index = 0; index < childCount; index++)
getChildAt(index).dispatchApplyWindowInsets(insets); // let children know about WindowInsets
return insets;
}
(メディアでの素敵なブログ投稿 このことに関するIan Lakeの記事もあります "マスターウィンドウのフィッターになる????" Chris Banesによるプレゼンテーション。
WindowInset
sについて Mediumの詳細な記事 も作成しました。
その他のリソース: