gpt4 book ai didi

java - 什么是 WindowInsets?

转载 作者:IT老高 更新时间:2023-10-28 23:17:06 25 4
gpt4 key购买 nike

我正在尝试了解 Android 操作系统,在阅读 Google I/O 2014 应用程序时,我遇到了 WindowInsets。如果有人能解释他们是什么,那将是一个很大的帮助。谢谢。

最佳答案

WindowInsets 是应用于窗口的系统 View (例如状态栏、导航栏)的插图(或大小)。

具体的例子很容易理解。想象一下这个场景:

enter image description here

现在,您不希望将 WindowInsets 应用于背景 ImageView,因为在这种情况下,ImageView 将被填充状态栏高度。

但您确实希望将插图应用于 Toolbar,否则 Toolbar 将被绘制在状态栏中间的某个位置。

View 通过以下方式声明希望在 xml 中应用 WindowInsets:

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 传递给其子级时,将调用此回调。 FrameLayoutLinearLayout 等布局不支持,DrawerLayoutCoordinatorLayout 支持。

您可以对布局进行子类化,例如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;
}

有一个 nice blog post at medium由伊恩·莱克 (Ian Lake) 撰写,关于这些东西,还有 "Becoming a master window fitter🔧" Chris Banes 的演讲。

我还创建了 a detailed article at Medium关于WindowInsets.

更多资源:

关于java - 什么是 WindowInsets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33585225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com