我正在为 Lollipop 和以前的版本开发一个 Android 应用程序。
我正在使用 CardView (这个 cardView 没有任何孩子,它只是放在我的 View 后面)来创建阴影。
但是当它在预棒棒糖设备上运行时会出现问题。
所以我将 cardUseCompatPadding 设置为 true。我想知道我是否可以获得这个兼容填充的值?
有没有什么地方可以找到该值的参考?
我正在为 Lollipop 和以前的版本开发一个 Android 应用程序。
我正在使用 CardView (这个 cardView 没有任何孩子,它只是放在我的 View 后面)来创建阴影。
但是当它在预棒棒糖设备上运行时会出现问题。
所以我将 cardUseCompatPadding 设置为 true。我想知道我是否可以获得这个兼容填充的值?
有没有什么地方可以找到该值的参考?
添加到 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);
更新 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)。