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