轻松搞定炫彩填充ProgressBar
文章名字似乎不是很明确,但暂时没有更好的名字。那就干脆先看看效果吧:
device-2018-09-04-010120.2018-09-04 01_05_42.gif
device-2018-09-13-235735.2018-09-13 23_58_50.gif
device-2018-09-13-235843.2018-09-13 23_59_45.gif
怎样样效果还可以吧!相似这样,也可以做出电池充电的效果
- 首先先分析如何实现:
- 画出来,这个对于简单图形来说可以。但如上图中的图形,要想绘制就会比较麻烦。
- 使用svg,上图是我从IconFont下载的一张图,IconFont提供svg和PNG两种格式下载。通过svg动画可以实现填充效果,但不知道如何控制进度。可能需要转换成path。
- 第三中方法就是我现在用的,很简单但很有效。在PS中有一个重要的概念-蒙版,通过蒙版我们可以在不影响底部图层的情况下,将新的内容融合到图层中。在本文中就相当于将有色彩的部分融合到黑白图层上。进度的变化就相当于对蒙版进行裁剪。
代码实现
定义底部图层和蒙版层:
底部是灰色的,上层是彩色的var bg: Bitmap? = nullvar mask: Bitmap? = null
裁剪:
裁剪是核心所在,通过裁剪变化产生视觉上填充的效果- 矩形裁剪
canvas.clipRect(0, calculateClipTop(progress), width, height)
- 圆形裁剪
path.addCircle(width / 2f, height / 2f, (progress * 1f / max) * (Math.max(width, height) / 2f), Path.Direction.CCW) path.close() canvas.clipPath(path)
- 不规则裁剪,这里简单用了下贝塞尔曲线
val baseHeight = (1- progress * 1f / max) * height var waveHeight = Math.min(50f, baseHeight) val left = 20f val right = width - 20f rate = (rate + 10) % max val actRate = rate * 1f / max waveHeight *= actRate path.moveTo(left,baseHeight + waveHeight) path.quadTo(right * 0.25f, baseHeight,right * 0.5f,baseHeight + waveHeight) path.quadTo(right / 0.75f, baseHeight + 2 * waveHeight ,right * 1f,baseHeight + waveHeight) path.lineTo(right * 1f, height * 1f) path.lineTo(left,height * 1f) path.lineTo(left,baseHeight + waveHeight) path.close() canvas.clipPath(path)
进度控制
进度与裁剪的范围成反比,具体如何控制要根据裁剪类型进行设置。
完整代码及样例已添加到Github仓库中, 欢迎指正!
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 轻松搞定炫彩填充ProgressBar
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 轻松搞定炫彩填充ProgressBar