博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CardView改变阴影颜色
阅读量:5915 次
发布时间:2019-06-19

本文共 2364 字,大约阅读时间需要 7 分钟。

项目GitHub地址 :

  • CardView本身自带了灰色的阴影颜色,但是是不可修改的,而UI往往要求按钮的颜色是红色的就需要红色的阴影,在GitHub上搜索ShadowLayout等关键字,找到一些实现阴影的库,但有的效果不好,有性能有问题,会一直重绘,导致cpu及内存占用过高,界面卡顿,甚至OOM。

  • 之前一直百思不得其解,为什么不让CardView能自定义阴影颜色呢,看了源码才搞清楚意图,我猜测有两个原因:

  1. 因为不想让使用者随便改变阴影颜色,因为自然界中不管什么颜色的物体,其阴影都是灰色

  2. API >=21 View支持了阴影,只能在5.0以上的手机上生效,而API < 21 阴影都是重新绘制的,而View默认的阴影是灰色的,所以API < 21 重新绘制的阴影其颜色也给写死了灰色,且不提供public api供外接访问,应该是为了5.0以上手机使用阴影有更高的效率

CardView values.xml文件
#03000000
#37000000
RoundRectDrawableWithShadow(Resources resources, ColorStateList backgroundColor, float radius, float shadowSize, float maxShadowSize) { mShadowStartColor = resources.getColor(R.color.cardview_shadow_start_color); mShadowEndColor = resources.getColor(R.color.cardview_shadow_end_color); }复制代码
  • 可以看出其实是支持自定义阴影颜色的,只不过在代码里给写死了,且未提供公开的api修改颜色的方法或属性
static {    if (Build.VERSION.SDK_INT >= 21) {        IMPL = new CardViewApi21Impl();    } else if (Build.VERSION.SDK_INT >= 17) {        IMPL = new CardViewApi17Impl();    } else {        IMPL = new CardViewBaseImpl();    }    IMPL.initStatic();}复制代码
  • 直接改变values.xml中的cardview_shadow_end_color与cardview_shadow_start_color在5.0及以上的手机中是不生效的,因为5.0以上的手机,根本不创建RoundRectDrawableWithShadow类,而是使用View自带的阴影方法设置的,所以不管怎么改变一直是灰色阴影,所以要想在5.0及以上的手机上可以改变阴影颜色,可以修改下代码,如下所示:
static {    //if (Build.VERSION.SDK_INT >= 21) {    //    IMPL = new CardViewApi21Impl();    //} else     if (Build.VERSION.SDK_INT >= 17) {        IMPL = new CardViewApi17Impl();    } else {        IMPL = new CardViewBaseImpl();    }    IMPL.initStatic();}复制代码
  • 这样就可以强制使其执行RoundRectDrawableWithShadow类来绘制阴影,改的颜色值也就生效了

  • 如果没有必须改变阴影颜色的需求,还是直接使用默认的,这样性能更好

  • 为了更方便的使用支持改变阴影颜色的CardView,我基于CardView 24.2.1版本改写了支持改变阴影颜色的库, 为了和官方的CardView库共存,且不冲突,我把所有属性、color及style的命名都加了前缀yc,当然也可以单独使用,使用方式如下

builb.gradle

最好和官方的CardView库一起使用,不需要特殊修改阴影颜色的地方,使用官方的CardView,需要修改View阴影的地方才使用YcCardViewimplementation 'com.zyp.cardview:cardview:1.0.1'复制代码

pom.xml

com.zyp.cardview
cardview
1.0.1
pom
复制代码
复制代码
  • 在引用第三方的UI库,特别是View绘制相关的,如果View本身没有变化,draw()方法却一直执行,这种问题就非常严重了,但是这种问题却是最好排查的,Android Studio自带的工具Android Device Monitor就可以轻松实现排查,如下图:

当然也可以使用Android Profiler,但是貌似不可以按照包名搜索。

转载于:https://juejin.im/post/5ba5946ee51d450e925227b4

你可能感兴趣的文章
搭建了一个多项目、插件化的ASP.net MVC开发框架
查看>>
Eclipse安装插件的几种方式
查看>>
我的友情链接
查看>>
什么是AD五大角色FSMO
查看>>
实战Heartbeat+mysql+共享存储实现高可用
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
两个HTML页面传值中文乱码
查看>>
用指针存储字符数组表示字符串
查看>>
一种简便无需代码的Mock方案
查看>>
概率论快速学习05:随机变量 二项分布 泊松分布
查看>>
利用HeaderDoc自动生成API文档
查看>>
一位铁粉的分享:阿里面试归来总结面经,已成功斩获P6 offer
查看>>
写给大忙人看的Go语言
查看>>
oracle 数据类型
查看>>
分享:这些PHP危险函数,你禁用了吗
查看>>
Linux下apache 2.2.6+php5.2.5+mysql5.0.46+Zend Optim安装详细说明
查看>>
js:实现菜单动态跟随
查看>>
W3School Jquery study
查看>>
聚合数据iOS SDK 快递查询演示示例
查看>>