web-dev-qa-db-ja.com

WindowInsetsとは何ですか?

Android OSについて知りたいのですが、Google I/O 2014アプリを読んでいるときにWindowInsetsに出会いました。その人が誰であるかを説明できる場合それは大きな助けになるでしょう。

19
Samvid Mistry

ここでは WindowInsetsについてすべて学ぶことができます。WindowInsetsは、アプリケーションで使用できるウィンドウ上の領域を提供します。それ自体はあまり役に立ちません。 View.onApplyWindowInsetsをオーバーライドするか、View.OnApplyWindowInsetsListenerを実装することが、本当の目的です。あなたはそれらについてここで読むことができます: View.onApplyWindowInsetsView.OnApplyWindowInsetsListener

カスタムの方法でビューにウィンドウインセットを適用するためのリスナー。

アプリは、ビューのウィンドウインセットの処理方法にカスタムポリシーを適用する場合、このインターフェイスを実装することを選択できます。 OnApplyWindowInsetsListenerが設定されている場合、ビュー自体のonApplyWindowInsetsメソッドの代わりに、そのonApplyWindowInsetsメソッドが呼び出されます。リスナーはオプションで、パラメータービューのonApplyWindowInsetsメソッドを呼び出して、ビューの通常の動作を自身の一部として適用できます。

つまり、これをオーバーライドすると、ビューで使用できるウィンドウの領域を制御できます。

4
Henry

WindowInsetsは、ウィンドウに適用されるシステムビュー(ステータスバー、ナビゲーションバーなど)のインセット(またはサイズ)です。

具体例でわかりやすいと思います。このシナリオをイメージします。

enter image description here

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を渡すと、このコールバックが呼び出されることに注意してください。 FrameLayoutLinearLayoutDrawerLayoutCoordinatorLayoutのようなレイアウト。

レイアウトをサブクラス化できます。 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によるプレゼンテーション。

WindowInsetsについて Mediumの詳細な記事 も作成しました。

その他のリソース:

60
azizbekian