Я пытаюсь узнать об ОС Android, и пока я читал приложение I/O 2014 Google, я наткнулся на WindowInsets
. Если кто-нибудь может объяснить, что это такое, это будет большой помощью. Спасибо.
Что такое WindowInsets?
Ответ 1
Вы можете узнать все о WindowInsets здесь. WindowInsets
предоставляет вам область в окне, которая может использоваться приложением. Само по себе это не очень полезно. Это истинная цель возникает, когда вы либо переопределяете View.onApplyWindowInsets
, либо реализуете View.OnApplyWindowInsetsListener
. Вы можете прочитать о них здесь: View.onApplyWindowInsets и View.OnApplyWindowInsetsListener
Слушатель для применения оконных вложений в представлении по-своему.
Приложения могут выбрать реализацию этого интерфейса, если они хотят применить настраиваемая политика к способу обработки оконных вставок для представления. Если установлен параметр OnApplyWindowInsetsListener, метод onApplyWindowInsets будет вызываться вместо метода Просмотр собственного метода onApplyWindowInsets. Слушатель может дополнительно вызвать параметр View's onApplyWindowInsets метод применения нормального поведения вида как части.
Короче говоря, переопределение этого параметра позволит вам управлять областью окна, доступной для вашего представления.
Ответ 2
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
своим 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.
Больше ресурсов: