在安卓系统中,什么是窗口插图?

21

这个问题听起来很蠢,如果是的话我很抱歉,但是我已经搜索了一下,想找到一个它们的视觉表示,并且没有找到。

以下是 Android 关于此的说法:

WindowInsets 是不可变的,将来可能会扩展以包括更多的插入类型。

http://developer.android.com/reference/android/view/WindowInsets.html

谷歌图片的自动纠正将其改为“窗口插入”...

为什么有人要处理这些“插入”? 它们与没有物理 home 键的移动电话上的导航栏有关吗?

5个回答

9

Insets是您的视图中不应放置元素的区域,例如状态栏或导航栏的后面。将它们视为窗口的填充。

如果您想要在它们后面绘制,例如将一张图片放在半透明状态栏后面,您需要消耗窗口insets。在某些视图中,这非常简单,只需添加android:fitsSystemWindows=true即可,但在其他视图中,则必须重写onApplyWindowInsets方法。

通常手机的窗口Insets是状态栏高度作为上部,导航栏高度作为下部,左右为0。但它可能会有所不同,例如手表或带有物理按钮的手机。


6

它们是Android Wear中使用的某些类型的带颜色的外边距(colored margin)。

它们用于创建主内容与实际边框之间的填充:

这里有几个例子(链接)


这是一个带有2个插图的图片:圆形/方形。

enter image description here


它们还可以用于其他视图中,以处理特殊的渲染要求,例如在 ScrollView 中:可通过insideInset定义实际滚动条的位置,如此问题所述。

<ScrollView
    android:id="@+id/view2"
    android:layout_width="100dip"
    android:layout_height="120dip"
    android:padding="8dip"
    android:scrollbarStyle="insideInset"
    android:background="@android:color/white"
    android:overScrollMode="never">

1
“它们是某种彩色边距(用于Android Wear)。”这是明显错误的。它们不仅在Android Wear上使用,而且在Android智能手机上也使用,此时它们代表系统UI元素的区域,例如状态栏和导航栏。 - Davide Cannizzo

3
您可以使用onApplyWindowInsets来处理窗口插图相关的问题:
@Override
public void onApplyWindowInsets(WindowInsets insets) {
    super.onApplyWindowInsets(insets);
    mRound = insets.isRound();
}

检测可穿戴式安卓设备是圆形还是方形,然后使用该信息绘制相应的应用程序界面(具有圆形或方形背景)。


1
我明白了。所以它们主要用于可穿戴设备? - Kyle
大多数情况下,你可以在这里阅读更多信息:http://developer.android.com/training/wearables/ui/layouts.html - marcinj

2
WindowInsets是一个表示所谓“窗口插图”的类。它们是一些边距/填充,您的内容应该具有以不重叠屏幕的不可用区域。正如许多人建议的那样,它们可以用于检测Android Wear设备是否为圆形并处理该形状。但是,在移动电话上使用的最常见情况可能是。状态栏和导航栏都是系统UI的一部分,因此它们覆盖了屏幕的不同区域,您不应将内容放置在其中。 Activity根据设置的窗口标志可以使用整个屏幕或在状态栏下方和导航栏上方调整大小(请参见WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREENWindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)。因此,如果您设置活动不处理窗口插图,则必须自己完成所有操作。您将使用View.setOnApplyWindowInsetsListener方法使自己在这些插图更改时注意到,并且您将根据侦听器中提供的值处理UI更改(例如设置某些填充)。

2

我写了一个示例

该存储库可以帮助理解Android窗口插入(windows insets)的概念和Edge-To-Edge概念,我们可以在不假设“键盘应该占屏幕的X部分”的情况下检测到键盘。

输入图像描述

输入图像描述

输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接