鼠扑 发表于 2024-6-11 09:13:36

Android进阶:最简单的方式实现自界说阴影结果

当你知道它继承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可以给绘制的图形增长阴影,还可以设置阴影的颜色
如图,赤色部门是我们绘制的图形,边框以内,赤色之外的是阴影的显示部门。
https://img-blog.csdnimg.cn/img_convert/79b08598bb1b89c19ec5f7fa0a8f9e7c.webp?x-oss-process=image/format,png
我们知道谷歌开发的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,最后开始绘画。
如许阴影就可以成功绘制了,这个方法代码量很少,很简单,也很实用。
https://img-blog.csdnimg.cn/img_convert/9cd32e51576abf5f82c370d4e2ab1bbd.webp?x-oss-process=image/format,png
为了更好的封装,我们可以为上面需要的参数进行定制,好比阴影的颜色,阴影的宽度,阴影的上下偏移,阴影的含糊度。
代码如下:
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移动开发全套学习资料》送给各人,初志也很简单,就是希望能够资助到想自学提升又不知道该从何学起的朋友,同时减轻各人的负担。
https://img-blog.csdnimg.cn/img_convert/65e7e2d560ec240cdbc975dd63932c82.png
https://img-blog.csdnimg.cn/img_convert/0cc46a6caae0508235af2b61b97da3e4.png
https://img-blog.csdnimg.cn/img_convert/b6e89e3688377a72838a0b24c0cb90f1.png
https://img-blog.csdnimg.cn/img_convert/f43d40944d19cf80f7000a050cb71304.png
由于文件比较大,这里只是将部门目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有资助,可以添加下面V无偿领取!(备注Android)
https://img-blog.csdnimg.cn/img_convert/fbf3da78ceee48a8f99642e3c7697d84.png
其他紧张知识点

下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。有**【Android架构视频+BATJ口试专题PDF+核心笔记等资料+源码+思维导图】。希望能够资助到各人提升技术。如果各人想要获取的话,可以私信我【666】免费获取哦~**
https://img-blog.csdnimg.cn/img_convert/f5ba402f3f36373b7509730c68134624.webp?x-oss-process=image/format,png
高级进阶篇——高级UI,自界说View(部门展示)
UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然如今远远不够了,拒绝无休止的CV,切身去项目实战,读源码,研究原理吧!
https://img-blog.csdnimg.cn/img_convert/565b5dccea2f26f439b81ce5a41c766c.webp?x-oss-process=image/format,png


[*]口试题部门合集
https://img-blog.csdnimg.cn/img_convert/ddd033e13f421caaa2912730c4570a4c.webp?x-oss-process=image/format,png
CV,切身去项目实战,读源码,研究原理吧!
[外链图片转存中…(img-UNLjR0gA-1710828765338)]


[*]口试题部门合集
[外链图片转存中…(img-5v0rxDhz-1710828765338)]

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Android进阶:最简单的方式实现自界说阴影结果