You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:如何为圆角CardView仅添加顶部阴影?

实现CardView仅顶部显示圆角阴影(透明背景)

方法一:利用MaterialCardView原生属性反转光照方向

Android MaterialCardView的阴影基于光照方向,默认光照来自上方,阴影集中在底部。通过修改光照方向为底部,即可让阴影显示在顶部,同时自动适配圆角样式。

  1. 定义自定义主题
    在res/values/styles.xml中添加主题:
<style name="CardTopShadowTheme" parent="Theme.MaterialComponents.Light">
    <!-- 设置光照从底部照射,阴影将出现在顶部 -->
    <item name="android:lightGravity">bottom</item>
    <!-- 启用elevation叠加,确保阴影颜色与主题匹配 -->
    <item name="elevationOverlayEnabled">true</item>
</style>
  1. 修改布局代码
    移除clipToOutline(会裁剪阴影),设置合适的cardElevation值,并应用自定义主题:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/viewRoot"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/transparent">

    <com.google.android.material.card.MaterialCardView
        android:theme="@style/CardTopShadowTheme"
        android:id="@+id/greenCardView"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:cardCornerRadius="16dp"
        app:cardElevation="16dp"
        android:clipToOutline="false"
        app:cardPreventCornerOverlap="true"
        app:cardBackgroundColor="@color/green">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/contentContainer"
            android:layout_width="match_parent"
            android:layout_height="54dp"
            android:background="@color/transparent"/>

    </com.google.android.material.card.MaterialCardView>

</androidx.constraintlayout.widget.ConstraintLayout>

方法二:自定义阴影Drawable叠加

如果需要更灵活的阴影样式(比如自定义颜色渐变),可以通过添加独立的阴影View实现:

  1. 创建顶部阴影Drawable
    在res/drawable/card_top_shadow.xml中定义渐变阴影:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:top="0dp"
        android:left="0dp"
        android:right="0dp"
        android:bottom="8dp">
        <shape android:shape="rectangle">
            <corners android:topLeftRadius="16dp" android:topRightRadius="16dp"/>
            <!-- 从上到下的半透明黑到透明渐变,模拟阴影 -->
            <gradient
                android:startColor="#1F000000"
                android:endColor="#00000000"
                android:angle="90"/>
        </shape>
    </item>
</layer-list>
  1. 修改布局添加阴影View
    在CardView上方添加一个View,设置阴影背景并与CardView顶部对齐:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/viewRoot"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/transparent">

    <!-- 顶部阴影View,高度对应阴影延伸长度 -->
    <View
        android:id="@+id/topShadow"
        android:layout_width="match_parent"
        android:layout_height="8dp"
        android:background="@drawable/card_top_shadow"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"/>

    <com.google.android.material.card.MaterialCardView
        android:id="@+id/greenCardView"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:cardCornerRadius="16dp"
        app:cardElevation="0dp"
        app:cardPreventCornerOverlap="true"
        app:cardBackgroundColor="@color/green">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/contentContainer"
            android:layout_width="match_parent"
            android:layout_height="54dp"
            android:background="@color/transparent"/>

    </com.google.android.material.card.MaterialCardView>

</androidx.constraintlayout.widget.ConstraintLayout>

注意事项

  • 方法一中android:clipToOutline必须设为false,否则会裁剪掉CardView外部的阴影。
  • 方法二中需保证阴影Drawable的圆角半径与CardView的cardCornerRadius一致,避免样式错位。

内容的提问来源于stack exchange,提问作者j2emanue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:10:40