关于 Android clipToPadding 属性的说明

Posted

技术标签:

【中文标题】关于 Android clipToPadding 属性的说明【英文标题】:Clarification about Android clipToPadding property 【发布时间】:2016-12-22 13:50:57 【问题描述】:

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

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

但是,我真的很想了解此属性的用途。我去了Android的文档,其中指出:

定义 ViewGroup 是否会剪裁其子级并调整大小(但 不剪辑)任何 EdgeEffect 到它的填充,如果填充不为零。这 属性默认设置为true。

我已经读了很多遍了,我在网上找了一些例子,但我真的没有找到一些。我发现的唯一视觉效果与此 ClipToPadding difference

相似

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

如果有人可以通过几个示例向我提供有关此属性的一些关键点以及它是如何工作的,那就太好了。

【问题讨论】:

呵呵。 Android 文档有时会让人感到困惑,更不用说充满了语法错误等等。也许this 可以提供帮助? (您需要通过点击 GIF 上方的 Read More 来展开文本。) 基本上,如果你clipToPadding=true,父母会剪掉它的孩子,就好像填充部分隐藏了它下面的孩子一样。我不知道我是否对你有意义...:/ 好吧,我也设法找到了与列表相同的示例,但我无法理解它是如何工作的,当没有列表但普通的 [无列表] 视图时:( Android what does the clipToPadding Attribute do?的可能重复 【参考方案1】:

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

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

正如this answer 中所述,当您拥有可滚动的视图(例如 ListView 或 RecyclerView)时,这也很有用。滚动列表时,会将内容绘制到其边界之外。如果您设置clipToPadding=false,您将能够看到该内容而不是内边距,并且只有在您完全向上或向下滚动时才能看到内边距。

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

这是clipToPadding=true 的样子,注意阴影是如何在底部被剪裁的,它位于两个红色矩形之间:

有了clipToPadding=false,我们看到了整个影子:

这是我使用的 XML:

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

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

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

    </RelativeLayout>

</RelativeLayout>

这是ovaldrawable:

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

【讨论】:

以上是关于关于 Android clipToPadding 属性的说明的主要内容,如果未能解决你的问题,请参考以下文章

android:clipToPadding和android:clipChildren

android:clipToPadding和android:clipChildren

Android 4.4 — 半透明状态/导航栏 — fitSystemWindows/clipToPadding 不能通过片段事务工作

仿淘宝Android实现底部导航栏图标溢出效果-clipChildren属性

Jetpack Compose ClipToPadding

RecyclerView clipToPadding = false