美文网首页android
关于Android 圆角 阴影

关于Android 圆角 阴影

作者: A不动啊 | 来源:发表于2018-07-20 15:12 被阅读148次

    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

    相关文章

      网友评论

        本文标题:关于Android 圆角 阴影

        本文链接:https://www.haomeiwen.com/subject/zexxmftx.html