Android 的CardView不显示阴影

  • Post author:
  • Post category:其他


今天在项目中遇到一个不大不小的问题。

1、为什么是不大的问题呢,因为确实是一个很小的问题,就是给一个布局的边框简单的增加阴影。

2、为什么又是一个不小的问题呢,因为我刚开始的想法是通过layer-list写一个xml文件,代码一顿敲后,结果完全达不到效果,真可谓是一顿操作猛如虎,伤害只有0.5。

3、坚信办法总比困难多。试试把布局嵌套在CardView中吧,结果无论怎么配置都不显示阴影,哎,傻眼了,上火啊,人生啊,茫茫啊!

4、嗯,好吧,不得不承认,几乎没用过CardView,对它的各个属性还不熟悉,静下心来,慢慢学习一下:

cardBackgroundColor 背景颜色
cardCornerRadius 圆角大小
cardElevation z轴的阴影大小
cardMaxElevation z轴的阴影最大高度值
cardUseCompatPadding 是否使用CompatPadding
cardPreventCornerOverlap 是否使用PreventCornerOverlap
contentPadding 内容于边距的间隔
contentPaddingLeft 内容与左边的边距
contentPaddingTop 内容与顶部的边距
contentPaddingRight 内容与右边的边距
contentPaddingBottom 内容与底部的边距


cardUseCompatPadding

:在Android 5.0及以下的系统中,CardView会添加一个额外的padding来绘制阴影,但是在Android 5.0以上的系统中是没有这个padding的,是直接绘制阴影。因此在Android 5.0以上系统,设置为false时,CardView不会专门去添加padding来绘制阴影;设置为true时会添加padding后绘制阴影,才与Android 5.0以下的效果保持一致。我们来看看该属性的源代码配置情况:

mCompatPadding = a.getBoolean(R.styleable.CardView_cardUseCompatPadding, false);

由此可见,

cardUseCompatPadding

属性的默认值为false,即不添加padding,因此我们就看不到阴影。


cardPreventCornerOverlap

:该属性表示是否添加内边距,用来避免内容与边缘重叠。设置为true时,也就是添加padding,使得content不与圆角重叠;设置为false时,也就是不添加padding,content将与圆角重叠,圆角被覆盖。我们也来看看该属性的源代码配置情况:

mPreventCornerOverlap = a.getBoolean(R.styleable.CardView_cardPreventCornerOverlap, true);

由此可见,

cardPreventCornerOverlap

属性的默认值为true,即添加padding,使得content不与圆角重叠。我们顺便看看其他属性的源代码配置情况吧:

if (a.hasValue(R.styleable.CardView_cardBackgroundColor)) {
    backgroundColor = a.getColorStateList(R.styleable.CardView_cardBackgroundColor);
} else {
    // There isn't one set, so we'll compute one based on the theme
    final TypedArray aa = getContext().obtainStyledAttributes(COLOR_BACKGROUND_ATTR);
    final int themeColorBackground = aa.getColor(0, 0);
    aa.recycle();

    // If the theme colorBackground is light, use our own light color, otherwise dark
    final float[] hsv = new float[3];
    Color.colorToHSV(themeColorBackground, hsv);
    backgroundColor = ColorStateList.valueOf(hsv[2] > 0.5f
                    ? getResources().getColor(R.color.cardview_light_background)
                    : getResources().getColor(R.color.cardview_dark_background));
}
float radius = a.getDimension(R.styleable.CardView_cardCornerRadius, 0);
float elevation = a.getDimension(R.styleable.CardView_cardElevation, 0);
float maxElevation = a.getDimension(R.styleable.CardView_cardMaxElevation, 0);
int defaultPadding = a.getDimensionPixelSize(R.styleable.CardView_contentPadding, 0);
mContentPadding.left = a.getDimensionPixelSize(R.styleable.CardView_contentPaddingLeft, defaultPadding);
mContentPadding.top = a.getDimensionPixelSize(R.styleable.CardView_contentPaddingTop, defaultPadding);
mContentPadding.right = a.getDimensionPixelSize(R.styleable.CardView_contentPaddingRight, defaultPadding);
mContentPadding.bottom = a.getDimensionPixelSize(R.styleable.CardView_contentPaddingBottom, defaultPadding);
if (elevation > maxElevation) {
    maxElevation = elevation;
}
mUserSetMinWidth = a.getDimensionPixelSize(R.styleable.CardView_android_minWidth, 0);
mUserSetMinHeight = a.getDimensionPixelSize(R.styleable.CardView_android_minHeight, 0);
a.recycle();

在理解了CardView的属性含义以及默认配置后就好办了,只是做如下简单的配置就能够看到阴影了:

<androidx.cardview.widget.CardView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="@color/primary_bg_gray"
    app:cardCornerRadius="@dimen/card_corners"
    app:cardUseCompatPadding="true">

    <!-- 这里自由填充布局控件 -->

</androidx.cardview.widget.CardView>

有的人说,还要在配置文件中开启硬件加速:android:hardwareAccelerated=”true”,个人觉得随意吧。

——记录工作中的点点滴滴,书写码农的平凡岁月!——



版权声明:本文为mahongy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。