Android clipToPadding属性的澄清

10

最近我在处理动画时遇到了麻烦,由于奇怪的原因,FrameLayout无法正确显示其阴影。

我找到了一个好的答案,它帮助了我,但是其中使用了一个叫做clipToPadding的属性。答案可以在这里找到:Android “elevation” not showing a shadow

然而,我真的想了解此属性的目的。我去查看了Android文档,其中写道:

定义ViewGroup是否裁剪其子元素并将任何EdgeEffect调整大小(但不裁剪),以适应其填充,如果填充不为零。此属性默认设置为true。

我已经反复阅读了很多次,并在网上寻找示例,但我真的没有找到一些。我找到的唯一图像类似于这个ClipToPadding difference

我可以在列表上看到效果,但是当例如只有一个ViewGroup中只有一个View时,它会如何影响呢?

如果有人能为我提供关于此属性及其如何与一些示例一起工作的几个要点,那将非常好。


2
嘿嘿。Android文档有时会令人困惑,更不用说充斥着语法错误和什么的了。也许这个链接可以帮到你?(你需要点击上方动图正上方的Read More来扩展文本。) - Ishita Sinha
基本上,如果你设置了clipToPadding=true,父容器将会像隐藏子元素的填充部分一样剪裁掉它的子元素。我不知道我说的是否让你明白... :/ - Ishita Sinha
1
好的,我也找到了相同的列表示例,但我无法理解在没有列表而是普通[非列表]视图的情况下它是如何工作的 :( - rofl
可能是Android中clipToPadding属性是干什么用的?的重复。 - Richard Le Mesurier
1个回答

37

clipToPadding的基本意思是“如果视图在其边界之外绘制到填充区域,用父容器的填充覆盖此绘制”。

一个浮动视图的阴影会在视图的边界外部绘制。为了使它可见,您需要确保视图周围有空间。您可以通过在父元素上设置填充来实现这一点,但这时你需要设置clipToPadding=false以便不覆盖阴影。

正如在这个答案中指出的,当你有一个可滚动的视图,比如ListView或RecyclerView时,这也非常有用。当滚动列表时,内容会超出其边界。如果你设置clipToPadding=false,你就能看到那个内容而不是填充,在你完全向上或向下滚动时只看到填充。

例如,让我们将椭圆形状设置为视图的背景,并提高这个视图。我们还将在容器中设置一些填充。下面的屏幕截图是在开发人员选项中激活“显示布局边界”后拍摄的。两个红色矩形之间的区域是父元素的填充。

Bounds and padding

这是当clipToPadding=true时的外观,注意阴影在底部被裁剪,因为它会位于两个红色矩形之间:

clipToPadding=true

clipToPadding=false时,我们可以看到整个阴影:

enter image description here

这是我使用的XML代码:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:background="#8888ff">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="40dp"
        android:paddingRight="40dp"
        android:paddingTop="20dp"
        android:paddingBottom="20dp"
        android:clipToPadding="false"
        android:layout_centerInParent="true">

        <View
            android:layout_width="170dp"
            android:layout_height="170dp"
            android:background="@drawable/oval"
            android:alpha="0.5"
            android:elevation="5dp"
            />

    </RelativeLayout>

</RelativeLayout>

这里是oval可绘制对象:

<shape android:shape="oval">
        <solid android:color="#f2f2f2"/>
</shape>

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