我有一个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>
我想拥有一个带有圆形阴影的圆形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>
因此导致一个问题,为什么它环绕CardView而不是带有阴影的CardView? 还有一个问题。您如何使CardView的阴影居中?如果您仔细观察第二个CardView,则阴影位于底部。
答案 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
放在屏幕的左侧或右侧时,其阴影也会偏向左侧或右侧。
但是,对于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。根据材料设计,阴影应同时来自环境光(前光源)和关键光(顶部光源):
在android框架中,这些光源的高度默认分别为90度和45度,并且无法更改,因为这与材质设计不一致。但是,如果要创建具有自定义角度的自定义阴影,则可以使用渐变可绘制对象并将其设置为阴影,如here在 使用形状可绘制对象的标题下(实施阴影) 。
基本上,您需要使用setShadowLayer
类中的android.graphics.Paint
方法。
希望这会有所帮助!