年前写新功能的时候遇到了一个特殊的TextView图文混排需求,使用安卓原生实现起来相对麻烦,网上也找不到现成的工具类,于是就自己钻研了一套实现方案在这里共享给大家,转载请注明出处。
工具实现了图片和文字高度一致对齐,同时也解决了TextView设置行间距导致图片下沉等控件级别的bug。Demo效果如下图(代码链接会放在文末),由于工具类的核心是使用 ImageGetter 来实现的,因此这个工具类也能支持网络图片的图文混排:
竖屏状态 横屏状态如上图未被解析的文案所示,工具类可以识别两种占位符:一种是自定义的本地图片占位符(需要开发者自行定义占位符内容和占位符所对应的本地图片id);另一种是直接插入 ImageGetter 可直接识别的 <img src=""/> 标签,让 ImageGetter 直接下载网络图片并展示在TextView之中。
本地图片占位符的定义位置至于工具类如何使用,主要通过三行代码就可以实现图文混排:
工具类使用示例另外,文案中图片的高度也可以通过TextView自身的属性进行微调:当 TextView 的属性includeFontPadding 设置为 false 的时候,文案的图片高度会稍微缩小,反之则会增加。当我们的图文混排工具类运用到数字或英文字母与图片混排的时候,我们可以将 includeFontPadding 置为 false,让图片的高度略微变小一些和数字高度对齐,确保图文混排样式的整体美观。
虽然工具类已经尽善尽美,但目前还有两个遗留的问题:
1、如果文字行间距过大(例如行间距在15dp以上)文字中的图片会出现模糊现象,主要原因还是图片 DrawBitmap 的时候没有限定宽高的原因,导致最终绘制上去的图片等比例拉伸变糊了,这个问题后续会优化。
2、如果图文混排中包含网络高清大图,并且 TextView 又设置了行间距,那么此文案在某个设备上首次展示的时候就需要花费较长的时间。这个问题优化起来比较费劲。因为带有行间距的TextView 直接进行图文混排会出现图片下沉的 bug,为了解决这个问题,就需要先将文案中所有的图片下载下来进行第一次测量,确定每个图片处于哪一行,对图片高度进行正确的处理之后才能展示给用户,如果此时用户网络不佳,TextView 文案就可能长时间处于空白状态。
最后附上Demo的github链接,希望对遇到相关需求的开发者有所帮助:https://github.com/liuchenguangqnm/richTextTool/tree/master
网友评论