1 圆角 阴影(支持所有View包括视频 GIF图等)
对于圆角,处理方式有很多种,但是好多都有所限制,比如不支持Gif图,和视频。
这里我采用的是Canvas.clip 和 绘制一层覆盖的边缘
两种方式都支持视频 和GIF 但缺点是有些手机上边缘有锯齿。
覆盖方式稍微好一些 没有那么明显 。
另外在5.0 以上建议使用View.OutlineProvider 效果很好。但是阴影只能使用系统的阴影效果。
不太美观。所以这里要看具体需求做一些取舍。
关键代码:
//这里不知为何 有些 View.draw有时不执行
// 重写View.draw
// 重写View.dipathDraw
c.clipPath(mClipPath)
阴影其实也就两种方式
1 Android L之后加入的z轴
2 Paint.setShadowLayer
其实还可以用 BlurMaskFilter 的外发光来实现
对于第一种当然一个属性就搞定了 但是效果说真的 很不美观。
所以我们采用第二种方式。
使用Paint.setLayer 的时候发现 并没有效果。百度一下发现需要setLayerType(LAYER_TYPE_SOFTWARE,null)
但是使用了setLayerType后 好像有点卡。
后来实验发现不设置setLayerType(LAYER_TYPE_SOFTWARE,null)也可以
方式是 :
1.先创建一个Bitmap 将阴影绘制到Bitmap上
canvas = Canvas()
mShadowBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888)
canvas?.setBitmap(mShadowBitmap)
mPaint.color = Color.TRANSPARENT
canvas?.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)
mPaint.setShadowLayer(mRealShadowSize, 0f, 0f, mShadowColor)
canvas?.drawPath(mShadowPath, mPaint)
2.然后再Bitmap绘制到View上层 (或者使用Clip方式也可在Clip之前绘制阴影)
c.save()
mClipPath.fillType = Path.FillType.WINDING
c.clipPath(mClipPath, Region.Op.DIFFERENCE)
c.drawBitmap(mShadowBitmap, 0f, 0f, mPaint)
c.restore()
效果如下:
2 圆角到直角的动画
其实就是动态的改变上面 的 Canvas.clipPath(mClipPath) 中mClipPath 中的圆角大小 然后从新绘制
具体可查看ShareAnim.kt 对CSHelper的操作
效果: