CardView高程阴影是否居中?

时间:2018-12-31 03:37:30

标签: android android-cardview androidx

我有一个CardView定义为

<androidx.cardview.widget.CardView
    android:layout_width="70dp"
    android:layout_height="70dp"
    app:cardCornerRadius="35dp"
    app:cardElevation="10dp">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY"
        android:src="@drawable/ic_user_default"/>
</androidx.cardview.widget.CardView>

但是我不知何故得到了这个奇怪的影子,我无法弄清楚为什么? enter image description here

我想拥有一个带有圆形阴影的圆形CardView,但是我在右下角有一个阴影。

我错过了什么?

我尝试了几件事,这就是我得出的结论。

CardView位于RelativeLayout中,该布局具有wrap_content作为layout_height。我猜这只是包装CardView,没有阴影。看看下面的例子。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <androidx.cardview.widget.CardView
            android:layout_width="70dp"
            android:layout_height="70dp"
            app:cardCornerRadius="35dp"
            app:cardElevation="10dp">
        </androidx.cardview.widget.CardView>
    </RelativeLayout>

    <androidx.cardview.widget.CardView
        android:layout_width="70dp"
        android:layout_height="70dp"
        app:cardCornerRadius="35dp"
        app:cardElevation="10dp">
    </androidx.cardview.widget.CardView>

</LinearLayout>

哪个会显示像 enter image description here

因此导致一个问题,为什么它环绕CardView而不是带有阴影的CardView? 还有一个问题。您如何使CardView的阴影居中?如果您仔细观察第二个CardView,则阴影位于底部。

2 个答案:

答案 0 :(得分:1)

$array= Array ( [0] => assets/image/man.jpg [1] => assets/image/violin.jpg [2] => assets/image/test.txt ) $m_array = preg_grep('/^.jpg\s.*/', $array); 阴影的偏差取决于其在屏幕上的位置。正如您在下图中所看到的,将CardView放在屏幕的左侧或右侧时,其阴影也会偏向左侧或右侧。

enter image description here

但是,对于AFAIK,我们无法控制CardView的阴影透视图,因为没有属性可以更改。如果要使用自定义方向阴影,则应自己做。

答案 1 :(得分:1)

我建议您看看android documentation for shadows

您说:

CardView位于RelativeLayout中,该布局具有wrap_content作为layout_height。我猜这只是包装CardView,没有阴影。这就引出了一个问题,为什么它围绕CardView而不是带有阴影的CardView?

以下回答原因:

  

阴影由高位视图的父级绘制,因此需要进行标准的视图裁剪,默认情况下,父级会对其进行裁剪。

也:

  

视图背景可绘制对象的边界确定其阴影的默认形状。考虑使用背景可绘制对象定义的该视图:

<TextView
    android:id="@+id/myview"
    ...
    android:elevation="2dp"
    android:background="@drawable/myrect" />
  

背景可绘制对象定义为带有圆角的矩形:

<!-- res/drawable/myrect.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="#42000000" />
    <corners android:radius="5dp" />
</shape>
  

视图可投射带有圆角的阴影,因为背景可绘制对象定义了视图的轮廓。提供自定义轮廓会覆盖视图阴影的默认形状。

您已经使用app:cardCornerRadius="35dp"而不是自定义背景可绘制对象(同样可以接受,但是我认为如果将来将来需要其他视图时添加此信息可能会有所帮助) )。

要回答问题如何使CardView的阴影居中?,您可以看看material design guidelines。根据材料设计,阴影应同时来自环境光(前光源)和关键光(顶部光源):

enter image description here

在android框架中,这些光源的高度默认分别为90度和45度,并且无法更改,因为这与材质设计不一致。但是,如果要创建具有自定义角度的自定义阴影,则可以使用渐变可绘制对象并将其设置为阴影,如here 使用形状可绘制对象的标题下(实施阴影)

基本上,您需要使用setShadowLayer类中的android.graphics.Paint方法。

希望这会有所帮助!