澄清Android clipToPadding属性

时间:2016-08-16 09:00:10

标签: android android-layout android-view

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

我找到了一个很好的答案,这对我很有帮助,但是使用了一个名为clipToPadding的属性。答案可以在这里找到:Android “elevation” not showing a shadow

但是,我真的很想了解这个属性的用途。我去了Android的文档,其中说明:

  

定义ViewGroup是否剪切其子节点并调整大小(但是   如果填充不为零,则不对任何EdgeEffect进行填充。这个   默认情况下,property设置为true。

我已经阅读了很多次,我在网上寻找了一些例子,但我找不到一些。我发现的唯一视觉效果类似于此ClipToPadding difference

我可以在列表中看到效果,但如果View中只有一个ViewGroup等,它会如何影响。

如果有人可以提供一些关于这个属性的关键点以及它如何使用一些例子,那将是很好的。

1 个答案:

答案 0 :(得分:9)

clipToPadding基本上意味着“如果视图超出其边界进入填充区域,则使用父级填充覆盖此绘图”。

高架视图的阴影被绘制在视图的边界之外。为了使其可见,您需要确保视图周围有空间。您可以通过在父级上设置填充来实现此目的,但是您需要设置clipToPadding=false以便不会覆盖阴影。

this answer中所述,当您具有可滚动视图(例如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 drawable:

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