9

我正在为 Lollipop 和以前的版本开发一个 Android 应用程序。

我正在使用 CardView (这个 cardView 没有任何孩子,它只是放在我的 View 后面)来创建阴影。

但是当它在预棒棒糖设备上运行时会出现问题。

所以我将 cardUseCompatPadding 设置为 true。我想知道我是否可以获得这个兼容填充的值?

有没有什么地方可以找到该值的参考?

4

2 回答 2

15

添加到 CardView 的兼容填充取决于您设置的角的高度和半径。您可以在支持库的 RoundRectDrawableWithShadow 类中找到实际计算。

您可以使用以下方法在运行时计算它:

    float elevation = cardView.getMaxCardElevation();
    float radius = cardView.getRadius();
    double cos45 = Math.cos(Math.toRadians(45));

    int horizontalPadding = (int) (elevation + (1 - cos45) * radius);
    int verticalPadding = (int) (elevation * 1.5 + (1 - cos45) * radius);
于 2016-01-07T14:12:53.063 回答
0

更新 CardView 的向后兼容最大高度。

如果设备操作系统版本是 Lollipop 或更高版本并且 getUseCompatPadding() 为 false,则调用此方法无效。使用此代码

android:elevation="3dp"app:elevation="3dp"到您的cardview

CardView 使用 Lollipop 上的高度属性作为阴影,并回退到旧平台上的自定义模拟阴影实现。

由于圆角裁剪的昂贵性质,在 Lollipop 之前的平台上,CardView 不会裁剪与圆角相交的子项。相反,它添加了填充以避免这种交集(请参阅 setPreventCornerOverlap(boolean) 以更改此行为)。

在 Lollipop 之前,CardView 为其内容添加填充并在该区域绘制阴影。此填充量等于 maxCardElevation + (1 - cos45) *cornerRadius 在侧面和 maxCardElevation * 1.5 + (1 - cos45) *cornerRadius 在顶部和底部。

由于填充用于抵消阴影的内容,因此您不能在 CardView 上设置填充。相反,您可以使用 XML 中的内容填充属性或代码中的 setContentPadding(int, int, int, int) 来设置 CardView 的边缘和 CardView 的子项之间的填充。

请注意,如果您为 CardView 指定精确的尺寸,由于阴影,Lollipop 之前和 Lollipop 之后的平台之间其内容区域会有所不同。通过使用 api 版本特定的资源值,您可以避免这些更改。或者,如果您希望 CardView 在 Lollipop 平台和之后添加内部填充,您可以调用 setUseCompatPadding(boolean) 并传递 true。

要以向后兼容的方式更改 CardView 的高度,请使用 setCardElevation(float)。CardView 将在 Lollipop 上使用海拔 API,在 Lollipop 之前,它将更改阴影大小。为避免在阴影大小变化时移动视图,阴影大小由 getMaxCardElevation() 限制。如果你想动态改变海拔,你应该在 CardView 初始化时调用 setMaxCardElevation(float)。

于 2016-11-14T18:12:15.250 回答