时间:2019.03.18~2019.03.22
Android Paint setFlags
背景
我们知道电商 APP,比如天猫,一般产品上面有两个价格。
一个是当前价格,一个是原价。
原价一般都会用删除线标识。
Android TextView 实现:
tvPrice.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
可以看到就是设置一个 FLAG 就可以了。
需求
产品看了之后说有锯齿,需要解决。
开发
我看了一下,既然是 paint 设置 FLAG,结合之前画图的经验,分分钟反锯齿给你加上,因此代码版本一出现:
TextPaint paint = tvPrice.getPaint();paint.setAntiAlias(true);paint.setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
一运行发现没解决?
解决问题:
既然问题出现了,那就解决吧。
一般有两种思路:
第一种就是直接利用搜索引擎,看看有没有其他人踩过坑。
第二种就是直接看源码。
本着这个是小问题,而且看源码可能解决起来比较快,我们就看下源码。
点击 setAntiAlias 可以看到源码的部分注释如下:
Helper for setFlags(), setting or clearing the ANTI_ALIAS_FLAG bit
可以看到本质上它也是通过设置标志位来达到去锯齿效果。
点进去 setFlags 可以看到源码的部分注释如下:
* Set the paint's flags. Use the Flag enum to specific flag values.** @param flags The new flag bits for the paint
可以看到是设置标志的值。
因此我们上面的代码后面设置的删除线标志值把反锯齿标志位清除了。
那可能你想颠倒下顺序看看是不是反锯齿会把删除线清除,你修改代码如下:
TextPaint paint = tvPrice.getPaint();paint.setFlags(Paint.STRIKE_THRU_TEXT_FLAG);paint.setAntiAlias(true);
结果发现删除线还在?
其实这是因为 setAntiAlias 并不是直接进行设置 Flag 操作。注释上面说了只是对 ANTI_ALIAS_FLAG 这个位做处理。
我们修改代码如下,就能够看到你期望的效果了。
TextPaint paint = tvPrice.getPaint();paint.setFlags(Paint.STRIKE_THRU_TEXT_FLAG);paint.setFlags(Paint.ANTI_ALIAS_FLAG);
那么现在我们既要反锯齿又要删除线,怎么办?
只需要设置一次 Flag 即可,然后通过位运算 | 将多个标志位连接起来。
tvPrice.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
这样期望的效果就达到了。
其实读者应该发现了,上面二脸懵逼误打误撞的代码其实也是另一种解决方法,不过要注意顺序,还要对方法有所了解,所以还是推荐上面的解决方法哈~
单词本
curly braces 花括号
underscore 下划线