这个迭代,UI在给了几张带阴影的图片,那种阴影范围很大,实际内容却只有一点的图片。
效果相似这样。 html
不知道这张图有没有表达清楚,就是那种图片之间阴影须要重叠才能使内容对其,阴影还有颜色的效果。
Android 5.0后才支持elevation属性,还不支持阴影颜色的设定。IOS同事笑了,他们说直接把阴影效果给他们,不要带阴影的图片,他们自然支持阴影,能够直接绘制。android
因而,上网搜索,发现目前Andorid 平台实现阴影大概有这么几种方式
一、使用.9图 inloop.github.io/shadow4andr…
二、CardView 不支持阴影颜色
三、开源库ShadowLayout
四、模仿FloatingActionButton 实现阴影等等。
这些方式是能够实现阴影的显示,可是基本都是将阴影做为控件的一部分去实现的。这样,就须要给控件设置一些padding值,才能让阴影显示出来。这种方式使得布局很不方便对齐。git
先上效果看看github
既然将阴影做为控件的一部分去实现不利于控件的布局和对其,那就咱就在ViewGroup里去实现阴影。绘制的时候根据子view的位置绘制出阴影,这样就不会影响控件的布局和对其了。bash
其实我以为控件的阴影自然就应该在父布局去实现,就像现实中的阴影那样。oop
Android 中有FrameLayout、LinearLayout、RelativeLayout、ConstraintLayout等等,这些layout是为了进行子view布局而设计的,若是不进行背景色的设置,默认是不走ondraw方法的。布局
咱们能够继承这些ViewGroup,设置setWillNotDraw(false)标志位强制进行绘制,这样咱们就既拥有了布局的功能,也拥有了绘制的功能。而后就能在onDraw方法中,根据子view的位置绘制背景了。post
这一步很简单,一个循环遍历子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,感受效果还不错。
使用起来大概像这样。
一、绘制阴影的时候有没有更好、更逼真的绘制方式?
二、项目中使用自定义属性 lint会报错 我只是强制屏蔽了。
但愿你们能分享分享!