Kotlin开发带背景动态文本叠加的自定义图像组件方法咨询
需求说明
我尝试基于Kotlin实现自定义ImageView或Drawable,要在运行时于基础图像上绘制带专属背景的动态文件扩展名文本,最终效果匹配随附的示例截图样式。
此前我曾自定义AppCompatImageView类并重写onDraw()方法实现该功能,但始终没有达到预期效果。由于我在自定义View绘制领域属于入门新手,希望获得门槛友好的实现指引。
补充要求:需要叠加的文件扩展名文本必须搭配专属的背景块,完全按照附件示例的样式绘制在基础图像上层。
新手常见踩坑点(为什么之前的
onDraw()重写没效果) - 重写
onDraw()时没有正确处理super.onDraw(canvas)的调用顺序:在super之前绘制的内容会被ImageView原生绘制的底层图片完全覆盖,根本显示不出来 - 绘制完更新后的扩展名文本后,没有调用
invalidate()触发View重绘,界面一直保留初始的绘制状态 - 没有给绘制画笔开启抗锯齿,绘制出来的文字和背景边缘模糊,看起来和示例样式差异很大
- 没有按照dp单位换算绘制的边距、文字大小,不同分辨率机型上的布局位置会错位
入门级实现方案
不需要完全从头自定义View,直接继承AppCompatImageView就能复用所有原生的图片加载、缩放、适配逻辑,开发量极小:
- 在自定义类内部提前初始化好需要的绘制对象:
- 带抗锯齿配置的
TextPaint,分别设置好文字颜色、背景块颜色、圆角半径参数 - 用于存储当前文件扩展名的可变字符串变量,对外提供公开的设置方法
- 带抗锯齿配置的
- 重写
onDraw()方法:第一行先调用super.onDraw(canvas),保证底层的基础图片正常绘制完成 - 在super调用完成后,再执行叠加内容的绘制逻辑:
- 先通过画笔的
measureText()方法计算当前扩展名文本的宽度,搭配提前定义好的内边距、外边距(按dp单位换算成像素值),算出带背景块的整体尺寸 - 按照示例要求的位置(通常是View右下角,和边界留固定间距),绘制带圆角的文本背景块
- 计算文字在背景块内的居中偏移量,把扩展名文本绘制在背景块上层,保证和背景的色彩对比度和示例一致
- 先通过画笔的
- 在公开的扩展名设置方法里,更新完内部存储的文本变量后,调用
invalidate()主动触发View重绘,界面就会实时显示新的文本内容
新手避坑:不要放弃
AppCompatImageView的继承优势从头写纯自定义View,那样需要处理图片Matrix缩放、不同ScaleType的适配、图片加载的生命周期兼容等大量原生已经做好的逻辑,对新手来说成本太高。
内容的提问来源于stack exchange,提问作者Renjith
相关产品推荐
相关产品推荐

