安卓原生开发图文混排显示
安卓原生开发图文混排显示
参考:
https://mp.weixin.qq.com/s?__biz=MzIwMzYwMTk1NA==&mid=2247486770&idx=1&sn=e1d42dfeed6b924512f037967a0b4a6d
http://answerzhao.github.io/2016/06/20/Spannable%E5%AE%9E%E7%8E%B0%E5%AF%8C%E6%96%87%E6%9C%AC/
http://blog.****.net/dhyjtt/article/details/53706820
http://blog.****.net/dyllove98/article/details/9174261
图文混排是经常要遇到的问题,安卓原生已经有了相应的对象做这件事情——spannable。在设置好之后,放入TextView就好了。
图文混排这里我们需要处理的是两类情况:
第一类是String+bitmap形式
第二类是html标签形式
String+bitmap形式
常用方法:
Spannable中定义了抽象方法:
setSpan(Object what, int start, int end, int flags)
what是我们需要设置的span类:
eg:
SpannableString spannableString = new SpannableString("君不见黄河之水天上来,");
spannableString.setSpan(absoluteSizeSpan, 1, 5, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(backgroundColorSpan, 1, 5, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
这里的start和end是我们要操作的文字的坐标。Flags是样式说明操作文字的时候的开闭状况。
Flags的种类:
在spnnable中我们可以对图片和文字的样式进行。
显示效果
最终我们的效果可以如图所示。
代码:
基本用法代码
这里展示的是spnnable的基本的用法,包括改变文字、加背景、斜体、粗体等
为文字设置点击事件:
对于可以相应的点击事件的textview,我们一定要加textView10.setMovementMethod(LinkMovementMethod.getInstance());
为文子设置资源标志符:
html形式
对为spannable所支持的html抱歉包括:
<br>,< p>,< div align=>,<strong>, <b>, <em>, <cite>, <dfn>, <i>,<big>, <small>,
<font size=>, <font color=>,<blockquote>, <tt>, <a href=>, <u>, <sup>,<sub>, <h1>,<h2>,<h3>,<h4>,<h5>,<h6>,<img src=>, <strike>
作为图文混排来讲,基本上已经满足要求了。
在spannble中,其图片给的是资源链接,所以,我们需要异步下载再去显示,这就比较复杂了。
在加载html中,我们用到的方法是:
Html.fromHtml(source,imageGetter,tagHandler);
l source,就是包含 HTML 内容的字符串。而 Html.ImageGetter 和Html.TagHandler 是两个接口,提供给开发者继承使用。
l imageGetter, 如果要显示图片是需要被继承的,重写 getDrawable(String source)方法,用于获取 HTML 里面的图片来显示在 TextView 中。
l tagHandler,其作用是把 HTML 带标记的文本内容字符串转化成可以显示效果的的 Spanned 字符串 。由于并非所有的 HTML 标签都可以转化,所以在使用时,用户需要自己添加一些必要的标签和处理方法时才会继承使用的。
但是因为N以上api有所改变,所以需要分sdk版本进行不同设置。
显示效果:
代码:
这里我们需要重写加载图片方法,从而实现异步的图片加载功能,这里用的是Glide框架加载图片:
git上的地址:https://github.com/huhanghao/TestForMixImgTxt