CardView cardUseCompatPadding

CardView cardUseCompatPadding

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

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

但是在Lollipop之前的设备上运行时就会出现问题。

所以我将 cardUseCompatPadding 设置为 true。我想知道我是否可以获得此 compat padding 的值?

有什么地方可以找到对值的引用吗?

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

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

    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);

Updates the backward compatible maximum elevation of the CardView.

Calling this method has no effect if device OS version is Lollipop or newer and getUseCompatPadding() is false. Use this code

android:elevation="3dp"app:elevation="3dp"到您的卡片视图

CardView uses elevation property on Lollipop for shadows and falls back to a custom emulated shadow implementation on older platforms.

Due to expensive nature of rounded corner clipping, on platforms before Lollipop, CardView does not clip its children that intersect with rounded corners. Instead, it adds padding to avoid such intersection (See setPreventCornerOverlap(boolean) to change this behavior).

Before Lollipop, CardView adds padding to its content and draws shadows to that area. This padding amount is equal to maxCardElevation + (1 - cos45) * cornerRadius on the sides and maxCardElevation * 1.5 + (1 - cos45) * cornerRadius on top and bottom.

Since padding is used to offset content for shadows, you cannot set padding on CardView. Instead, you can use content padding attributes in XML or setContentPadding(int, int, int, int) in code to set the padding between the edges of the CardView and children of CardView.

Note that, if you specify exact dimensions for the CardView, because of the shadows, its content area will be different between platforms before Lollipop and after Lollipop. By using api version specific resource values, you can avoid these changes. Alternatively, If you want CardView to add inner padding on platforms Lollipop and after as well, you can call setUseCompatPadding(boolean) and pass true.

To change CardView's elevation in a backward compatible way, use setCardElevation(float). CardView will use elevation API on Lollipop and before Lollipop, it will change the shadow size. To avoid moving the View while shadow size is changing, shadow size is clamped by getMaxCardElevation(). If you want to change elevation dynamically, you should call setMaxCardElevation(float) when CardView is initialized.