小工具知识网

当前位置: 首页 > 行业知识 > Android进阶:最简单的方式实现自定义阴影效果

行业知识

Android进阶:最简单的方式实现自定义阴影效果

2026-11-07 21:14:52 来源:互联网转载

当你知道它继承FrameLayout的时候你就知道怎么使用了,但是这个CardView有很多局限性,比如不能修改阴影的颜色,不能修改阴影的深浅。这就很诡异了,根本无法满足UI设计潮流的内心。

那为了产品蒸蒸日上,早日走上人生巅峰,实现财富自由,应该如何让你的APP支持修改阴影的颜色呢?

有个很暴力的办法,就是吧CardView的代码自己抠出来,然后自己定制,网上已经有很多人这样做了。

比如这篇CSDN博主就这样做了:https://blog.csdn.net/wangjie_de/article/details/82993017

思路:修改谷歌原生的CardView代码:原生的CardView的阴影逻辑分为高版本21以上的和低版本21一下的两种方案处理,其中低版本使用了渐变色来初六阴影渐变的效果,而高版本使用了 Elevation来设置阴影,但是 Elevation又没提供修改颜色的方法,所以作者就把高版本的实现方案拿掉了,统一采用低版本的处理方法,就可以修改颜色了。具体过程请看其博客。

但是现在我自己探索了一个新的较为简单的添加阴影的实现方案,仅供参考

ShadowCardView

思路:首先要明确阴影的实现思路是什么,其实就是颜色导致的视觉错觉。说白了就是在你的Card周围画一个渐变的体现立体感的颜色。

基于上述思路,我们在一个在一个view上画一个矩形的图形,让他周围有渐变色的阴影即可。于是我们想起几个API:

  • 类:Paint 用于在Android上画图的类,相当于画笔
  • 类:Canvas 相当于画布,Android上的view的绘制都与他相关
  • 方法:paint.setShadowLayer可以给绘制的图形增加阴影,还可以设置阴影的颜色

    如图,红色部分是我们绘制的图形,边框以内,红色之外的是阴影的显示部分。

    我们知道谷歌开发的CardView的控件继承了FrameLayout,方便我们自由扩展。那么我们也需要继承FrameLayout。

    ShadowCardView继承FrameLayout之后,可以重写其一个方法:

    @Override

    protected void dispatchDraw(Canvas canvas) {

    super.dispatchDraw(canvas);

    }

    这个方法是ViewGroup在绘制子View的时候调用的,那么我们可以在这个时候进行阴影的绘制。

    首先,这个方法已经为我们提供了这个View的画布:Canvas,我们可以直接在上面进行阴影的绘制,代码如下:

    Paint shadowPaint = new Paint();

    shadowPaint.setColor(Color.RED);

    shadowPaint.setStyle(Paint.Style.FILL);

    shadowPaint.setAntiAlias(true);

    float left = 45;

    float top = 45;

    float right = getWidth() - 45;

    float bottom = getHeight() - 45;

    shadowPaint.setShadowLayer(45, 0, 0, getContext().getResources().getColor(R.color.color_000000));

    RectF rectF = new RectF(left, top, right, bottom);

    canvas.drawRoundRect(rectF, 0, 0, shadowPaint);

    canvas.save();

    • 创建画笔,设置画笔的颜色,风格
    • 获取绘画的范围:ShadowCard的范围减去需要的阴影的范围,假如阴影的宽度为45px,则在ShadowCard内部的45px内进行绘制
    • 给画笔设置阴影的颜色,阴影的模糊度,模糊度值越大越模糊,且不能为0
    • 创建RectF,最后开始绘画。

      这样阴影就可以成功绘制了,这个方法代码量很少,很简单,也很实用。

      为了更好的封装,我们可以为上面需要的参数进行定制,比如阴影的颜色,阴影的宽度,阴影的上下偏移,阴影的模糊度。

      代码如下:

      public class ShadowViewCard extends FrameLayout {

      private static final int DEFAULT_VALUE_SHADOW_COLOR = R.color.shadow_default_color;

      private static final int DEFAULT_VALUE_SHADOW_CARD_COLOR = R.color.shadow_card_default_color;

      private static final int DEFAULT_VALUE_SHADOW_ROUND = 0;

      private static final int DEFAULT_VALUE_SHADOW_RADIUS = 10;

      private static final int DEFAULT_VALUE_SHADOW_TOP_HEIGHT = 5;

      private static final int DEFAULT_VALUE_SHADOW_LEFT_HEIGHT = 5;

      private static final int DEFAULT_VALUE_SHADOW_RIGHT_HEIGHT = 5;

      private static final int DEFAULT_VALUE_SHADOW_BOTTOM_HEIGHT = 5;

      private static final int DEFAULT_VALUE_SHADOW_OFFSET_Y = 0;

      private static final int DEFAULT_VALUE_SHADOW_OFFSET_X = DEFAULT_VALUE_SHADOW_TOP_HEIGHT / 3;

      private int shadowRound;

      private int shadowColor;

      private int shadowCardColor;

      private int shadowRadius;

      private int shadowOffsetY;

      private int shadowOffsetX;

      private int shadowTopHeight;

      private int shadowLeftHeight;

      private int shadowRightHeight;

      private int shadowBottomHeight;

      public ShadowViewCard(Context context) {

      this(context, null);

      }

      public ShadowViewCard(Context context, AttributeSet attrs) {

      this(context, attrs, 0);

      }

      public ShadowViewCard(Context context, AttributeSet attrs, int defStyleAttr) {

      自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

      深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

      因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

      由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

      如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)

      其他重要知识点

      下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。有**【Android架构视频+BATJ面试专题PDF+核心笔记等资料+源码+思维导图】。希望能够帮助到大家提升技术。如果大家想要获取的话,可以私信我【666】免费获取哦~**

      高级进阶篇——高级UI,自定义View(部分展示)

      UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

      • 面试题部分合集

        CV,亲自去项目实战,读源码,研究原理吧!

        [外链图片转存中…(img-UNLjR0gA-1710828765338)]

        • 面试题部分合集

          [外链图片转存中…(img-5v0rxDhz-1710828765338)]

上一篇:13. Springboot集成Protobuf

下一篇:规范网址怎么写?