Что такое WindowInsets?

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

2 ответов


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

прослушиватель для применения оконных вставок в представлении пользовательским способом.

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

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


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

вы можете подкласс вашего макета, например,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 Ян Лейк относительно этого материала, также "стать главным оконным слесарем" презентация Криса Бэйнса.

я также создал подробная статья на Medium в отношении WindowInsets.

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