最近利用业余时间,开发了一款基于懂球帝接口数据的足球资讯app,整体的UI也是仿照懂球帝设计的。这是一个比较综合的项目,用到了不少以前没用过的组件和api,而且产生了很多新的开发思路,有些实现方式也是自己琢磨的,所以值得做一些记录,可能还存在瑕疵和可以优化的地方,也希望大家给我多指正。

先来看看实现前后的对比图:

再来看一看接口返回的数据(数据结构比较长,这里只截取了部分用到的数据):

可以看到,懂球帝这里是通过file_name去跟文本中对应的标记匹配来实现图文混排的,而不是通过html格式去做的,因此我这里想到的是通过在spannableString中插入图片的方式去实现混排。

思路整理

1、通过glide将图片下载下来;

Glide.with(context).load(a.getUrl()).into(new SimpleTarget<Drawable>() {@Overridepublic void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {}
});

2、利用String的indexOf函数,通过匹配file_name,找到图片在文本中的位置;

int startIndex = circle.getContent().indexOf(a.getFile_name());
int endIndex = startIndex+a.getFile_name().length();

3、利用spannableString的setSpan函数,将图片插入到对应位置;

spannableString.setSpan(imageSpan, startIndex,endIndex, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

遇到的问题

1、下载图片是需要通过异步方式去实现的,那么我就没法控制 当所有图片都下载完成后再通知TextView更新文本了。

解决办法:后来发现spannableString的setSpan()并不会覆盖上一次的样式,而是类似于addSpan的效果,因此我的解决方法就是每加载完一张图片,就setSpan()一次,更新一次样式;

spannableString.setSpan(imageSpan, startIndex,endIndex, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
handler.sendEmptyMessage(i);
Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {tvContent.setText(spannableString);}
};

2、setSpan之后,文本的{{p1}}、{{p2}}等处确实不显示了,但图片未加载到对应位置。

解决办法:出现这种问题的原因是没有对图片的宽高进行设置,需要调用drawable的setBounds()设置图片的大小。

//设置图片显示的宽高
resource.setBounds(0,0,(int)picWidth,(int)picHeight);

3、图片与文字之间的行高与文件间的行高不一致;

解决办法:首先去除文本中多余的空行

public static String deleteCRLF(String input) {return input.replaceAll("((\r\n)|\n)[\\s\t ]*(\\1)+", "$1").replaceAll("^((\r\n)|\n)", "");
}

然后对ImageSpan做一些处理(这个是我直接上网百度的,原理有待研究)

public class MyImageSpan extends ImageSpan {public MyImageSpan( Drawable b) {super(b);}@Overridepublic void draw(Canvas canvas, CharSequence text, int start, int end,float x, int top, int y, int bottom, Paint paint) {Drawable b = getDrawable();canvas.save();int transY;//要显示的文本高度-图片高度除2等居中位置+top(换行情况)transY = ((bottom - top) - b.getBounds().bottom) / 2 + top;//偏移画布后开始绘制canvas.translate(x, transY);b.draw(canvas);canvas.restore();}}

最终实现

     Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {tvContent.setText(spannableString);}};for(CircleNews.Attachment a: circle.getAttachments()){Glide.with(context).load(a.getUrl()).into(new SimpleTarget<Drawable>() {@Overridepublic void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {MyImageSpan imageSpan = new MyImageSpan(resource);//ImageSpan imageSpan = new ImageSpan(resource);double picWidth = UIUtils.getScreenWidth(context);double ratio = picWidth/(double)resource.getIntrinsicWidth();double picHeight = ratio*resource.getIntrinsicHeight();//设置图片显示的宽高resource.setBounds(0,0,(int)picWidth,(int)picHeight);int i = circle.getAttachments().indexOf(a);int startIndex = circle.getContent().indexOf(a.getFile_name());int endIndex = startIndex+a.getFile_name().length();spannableString.setSpan(imageSpan, startIndex,endIndex, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);handler.sendEmptyMessage(i);}});}

总结

之前处理富文本通常是通过html样式的去实现的;通过研究懂球帝的这个api接口,又获得了一种新的思路:可以通过SpannableString+文本标记的方式去实现富文本,使用SpannableString的好处是可以实现高度的自定义,比如说插入一个自定义表情,使用SpannableString只需在文本中增加一个标记识别即可,而使用html样式的话,就相对复杂了。实现这种图文混排的方式应该还有很多,如果你耐心看到这里,不妨留下你的一些想法吧,我们可以一起交流,共同进步!

#Android笔记# 超级足球app 开发总结(二)—— SpannableString根据标记插入文字实现图文混排相关推荐

  1. #Android笔记# 超级足球app 开发总结(三)—— CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout实现两种折叠效果

    最近利用业余时间,开发了一款基于懂球帝接口数据的足球资讯app,整体的UI也是仿照懂球帝设计的.这是一个比较综合的项目,用到了不少以前没用过的组件和api,而且产生了很多新的开发思路,有些实现方式也是 ...

  2. #Android笔记# 超级足球app 开发总结(一)—— 项目组件化与路由的使用

    最近利用业余时间,开发了一款基于懂球帝接口数据的足球资讯app,整体的UI也是仿照懂球帝设计的.这是一个比较综合的项目,用到了不少以前没用过的组件和api,而且产生了很多新的开发思路,有些实现方式也是 ...

  3. Android中实现不同文字颜色和图文混排的Span总结

    一.怎么在TextView中设置首行缩进两个字符 在string资源文件中,在文字的前面加入"\u3000\u3000"即可实现首行缩进 在Java代码中,使用setText(&q ...

  4. 基于yolov5的Android版本目标检测app开发(部署安卓手机)

    基于yolov5的Android版本目标检测app开发(部署安卓手机) 0.项目开发需求 (1)开发app部署到安卓手机 (2)支持VOC数据集上所有的目标检测 1.开发环境搭建 windows10+ ...

  5. Android常用实例——截取APP当前界面(可带图片、文字水印)

    Android常用实例--截取APP当前界面(可带图片.文字水印) 标签: android界面截图保存图片 2016-08-16 10:52 1262人阅读 评论(2) 收藏 举报  分类: Andr ...

  6. 两文本一图片android,Android富文本编辑器(二):图文混排以及图片上传处理

    对于一个富文本编辑器来说,图文混排是最基本的功能.而从上一篇文章中我们知道图文混排需要使用ImageSpan.下面这段代码摘自我的RichEditText源码: /** * 添加图片 * @param ...

  7. android 实现表格横向混动_Android图文混排实现方式详解

    在使用TextView的时候,我们经常需要在TextView中进行图文混排,比如在QQ中聊天的消息中的表情,底部tab图标等. 一.场景 二.实现方式 Android官方对TextView的图文混排提 ...

  8. Android 动态图文混排的常用方法

    2019独角兽企业重金招聘Python工程师标准>>> DrawableIcon的设置 对于TextView或者EditText动态设置drawableLeft,drawableRi ...

  9. android多媒体图文混排,干货!!!Android富文本实现图文混排

    效果图 rich.jpg 像图中的效果,大家在开发并不少见,大家可能不知道android提供了实现图文混排的类.大家或许会写一个布局或者使用drawableLeft这个属性实现文本的左侧图标. and ...

最新文章

  1. 抖音爬取粉丝用户列表_抖音分享页用户信息爬取
  2. Android 10 vivo,更快更安全,vivo产品经理宣布:iQOO将首批适配Android 10正式版
  3. 如何用 Python 打飞机?
  4. 沈阳生态所在保护性耕作促进农业可持续发展方面取得新进展
  5. ubuntu子系统多版本
  6. MFC中修改程序图标
  7. HarmonyOS之深入解析图像的编码和解码
  8. springboot不会运行gc_SpringBoot 和JVM 调优(深度好文,建议收藏)
  9. Python总结:保留小数点任意位round函数不够精确
  10. centos6 安装xhprof扩展
  11. 轻量级网页安全漏洞扫描工具-Wapiti
  12. 阿里巴巴内部资料:2018全技术栈图册ppt分享
  13. 干货,分享!后台信息管理HTML静态网页模版
  14. java 串口 rxtx_java使用RXTX进行串口通信
  15. ubuntu报错 E:无法定位软件包
  16. 《一次失败沟通后的自我觉察》
  17. 正态分布的概率密度函数 python_多元正态分布概率密度函数的三维绘图
  18. 《西部世界》暗示了大数据人工智能什么
  19. python批量合并excel文件,后缀名为xls
  20. 【Unity】Obi插件系列(一)—— 总览、Actors与Solvers

热门文章

  1. X86平台虚拟化问题
  2. 一款使用欧拉回路算法模拟二代测序机器打碎后序列的拼装软件
  3. sqr和Oracle的区别,Oracle学习笔记:a inner join b与from a,b where a.x=b.x的差异
  4. 使用163邮箱发送邮件出现553 authentication is required
  5. 葡萄城报表 V12正式发布,持续增强在线设计能力
  6. N皇后(Java完整代码+最简单直观解析)
  7. 超级应用:让移动巨幕走进寻常百姓家
  8. 题目2:隐式图的搜索问题(实验准备)
  9. GIS在精准农业中的应用
  10. 雷军宣布小米IoT全面升级:WiFi模组降到9.9 接入宜家灯泡 推门锁新品