android画布裁剪圆角,Android 视图圆角化处理方案

本文介绍了在Android中实现视图圆角化的多种方案,包括Canvas.clipXXX的性能损耗问题、Fresco自带的roundWithOverlayColor属性及其局限,以及CardView的实现细节和兼容性问题。文章详细分析了CardView在API 21以下的表现,并提出了自定义解决方案应对兼容性挑战。
摘要由CSDN通过智能技术生成

前言

最近项目中突然要将用到图片(项目使用Fresco)及视频(项目使用TextureView绘制纹理,SurfaceView不在本文讨论之列,绝大部分播放器为了视图可控,现在都会采用TextureView而不是SurfaceView。原因的话那又是另一片大海,自行脑补)的地方都进行圆角化,且需支持可控实验,即开关开启时圆角关闭时非圆角。由于工程运行已久,图片及视频的地方甚多,除了考虑技术方案外,还需考虑人工成本。

各种圆角化方案探索对比

方案一 : 直接采用Canvas.clipxxx 相关api,裁剪出一个圆角区域

emmmmmm...... 该方案简单暴力,通用性强。然后,全文终。

b24683e29aff

黑脸

然后你就会发现,你的页面也终了。如果只是一个静态的单图视图,该方法问题不大,但如果是复杂页面,滚动的时候,测试就会跟你说,页面卡顿了,要优化。

原因就是 Canvas.clip的相关api损耗相对较大。

方案二 :直接Fresco自带功能

1: 直接使用 roundedCornerRadius属性,然后你就会惊奇地发现,静图很完美,动图无效了......

2: 经过一番查找,发现fresco已经给出动图的解决方案,加上roundWithOverlayColor属性,该属性支持传drawable类型,然后动图可以圆角化了

...泪大普奔,可以下班了。

但是 我们工程原来很多地方是类似头条这样,item有点击背景的.

b24683e29aff

item点击背景改变.gif

而圆角只是在图片的各个角上,使用该属性实现的话,你会发现如下现象

b24683e29aff

overlayColor透出4个角不同颜色.gif

问题一:外层背景颜色改变时,盖住的4个角的颜色,并无随外层点击颜色变化,4个角还是上次的默认颜色透出

这个现象,如果圆角不是很大,且大item的不同状态间颜色差异不大时,不是很明显。原因roundWithOverlayColor属性采用的是一个普通的静态drawable,当外部背景按下时OverlayDrawable,并无刷新。

那我们就在外部背景按下时,重新设置roundWithOverlayColor色值,然后重新调用加载图片?

原理可行,但通过fresco二次加载的方式,性能还是有点浪费。如果项目中不用处理视频,或允许视频与图片2套的化,图片圆角化可以采用该方案。

该方案应该有点可以优化,就是不要调用二次加载方式,而是按下去时

获取OverlayDrawable(没再认真去看源码,是否叫这名字,暂时这样叫)然后根据颜色刷新该层drawable就好。Fresco的原理就是一层层的drawable,然后控制器根据当前状态,来显示对应层的drawable,猜测roundWithOverlayColor应该是有单独对应一层drawable的。由于我没采用该方案,具体细节不再细究。

如果采用该方案,那接下来就又要开启视频的圆角方案之旅了

方案三 :最终大招 CardView

经过一番思考后,我们终于想到了 系统提供的CardView,然后我们就开始了 全工程改造。

把原来全工程各个视频控件和

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值