Что такое WindowInsets?

Я пытаюсь узнать об ОС Android, и пока я читал приложение I/O 2014 Google, я наткнулся на WindowInsets. Если кто-нибудь может объяснить, что это такое, это будет большой помощью. Спасибо.

Ответ 1

Вы можете узнать все о WindowInsets здесь. WindowInsets предоставляет вам область в окне, которая может использоваться приложением. Само по себе это не очень полезно. Это истинная цель возникает, когда вы либо переопределяете View.onApplyWindowInsets, либо реализуете View.OnApplyWindowInsetsListener. Вы можете прочитать о них здесь: View.onApplyWindowInsets и View.OnApplyWindowInsetsListener

Слушатель для применения оконных вложений в представлении по-своему.

Приложения могут выбрать реализацию этого интерфейса, если они хотят применить настраиваемая политика к способу обработки оконных вставок для представления. Если установлен параметр OnApplyWindowInsetsListener, метод onApplyWindowInsets будет вызываться вместо метода Просмотр собственного метода onApplyWindowInsets. Слушатель может дополнительно вызвать параметр View's onApplyWindowInsets метод применения нормального поведения вида как части.

Короче говоря, переопределение этого параметра позволит вам управлять областью окна, доступной для вашего представления.

Ответ 2

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 своим WindowsInsets. Такие макеты, как FrameLayout, LinearLayout - нет, DrawerLayout, CoordinatorLayout нет.

Вы можете FrameLayout подкласс своего макета, например, 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;
}

Есть хорошая публикация в блоге Иана Лейка на эту тему, а также презентация Криса Бэйнса "Как стать мастером оконного оборудования".

Я также создал подробную статью на Medium о WindowInset s.

Больше ресурсов: