android

关于Android 圆角 阴影

2018-07-20  本文已影响148人  A不动啊

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的操作

效果:    


共享动画

项目地址  https://github.com/XueMoMo/CSLayout  

CODING https://git.coding.net/eericxu/CSLayout

上一篇 下一篇

猜你喜欢

热点阅读