Android无pading超简单超实用阴影解决方案

前言

这个迭代,UI在给了几张带阴影的图片,那种阴影范围很大,实际内容却只有一点的图片。
效果相似这样。 html

不知道这张图有没有表达清楚,就是那种图片之间阴影须要重叠才能使内容对其,阴影还有颜色的效果。
Android 5.0后才支持elevation属性,还不支持阴影颜色的设定。IOS同事笑了,他们说直接把阴影效果给他们,不要带阴影的图片,他们自然支持阴影,能够直接绘制。android

因而,上网搜索,发现目前Andorid 平台实现阴影大概有这么几种方式
一、使用.9图 inloop.github.io/shadow4andr…
二、CardView 不支持阴影颜色
三、开源库ShadowLayout
四、模仿FloatingActionButton 实现阴影等等。
这些方式是能够实现阴影的显示,可是基本都是将阴影做为控件的一部分去实现的。这样,就须要给控件设置一些padding值,才能让阴影显示出来。这种方式使得布局很不方便对齐。git

个人解决方案

先上效果看看github

既然将阴影做为控件的一部分去实现不利于控件的布局和对其,那就咱就在ViewGroup里去实现阴影。绘制的时候根据子view的位置绘制出阴影,这样就不会影响控件的布局和对其了。bash

其实我以为控件的阴影自然就应该在父布局去实现,就像现实中的阴影那样。oop

实现思路

一、继承ViewGoup

Android 中有FrameLayout、LinearLayout、RelativeLayout、ConstraintLayout等等,这些layout是为了进行子view布局而设计的,若是不进行背景色的设置,默认是不走ondraw方法的。布局

咱们能够继承这些ViewGroup,设置setWillNotDraw(false)标志位强制进行绘制,这样咱们就既拥有了布局的功能,也拥有了绘制的功能。而后就能在onDraw方法中,根据子view的位置绘制背景了。post

二、复写onDraw方法绘制子view背景

这一步很简单,一个循环遍历子view就行了spa

如何绘制

一、绘制以前 须要设置 setLayerType(View.LAYER_TYPE_SOFTWARE, null)关闭硬件加速,由于一些高级绘制方法可能不支持硬件加速。
二、为paint设置 shadowLayer设计

paint.setShadowLayer(shadowLayoutParams.shadowRadius, shadowLayoutParams.xOffset
                            , shadowLayoutParams.yOffset, shadowLayoutParams.shadowColor);
复制代码

三、2那种绘制方式边缘有些整齐,可能会不知足需求。这里还有一种方式,为 Paint设置MaskFilter。 具体能够看看这篇文章 www.cnblogs.com/tianzhijiex…

个人实现

我我的比较喜欢使用ConstraintLayout等等,因此继承ConstraintLayout实现了一个demo,感受效果还不错。

使用起来大概像这样。

项目地址 github.com/ZhangHao555…

须要改进

一、绘制阴影的时候有没有更好、更逼真的绘制方式?
二、项目中使用自定义属性 lint会报错 我只是强制屏蔽了。

有没有更好的解决方式?

但愿你们能分享分享!

另外 附上另外一篇文章 RecyclerView实现banner 滑动缩放、循环滑动效果 juejin.im/post/5d05df…

相关文章
相关标签/搜索