概述
前段时间公司需求需要做TextView支持带图片的富文本功能,网上很多TextView 富文本的第三方库,不过大多都太繁琐了,并且我们的需求很简单,就是需要加载富文本(富文本有可能带有图片)。于是就在网上找相关方法。一共测试两种方法,下面分别介绍:
1 将html设置到TextView中的工具类中
TextView有setText(Html.fromHtml(source))
方法,其中source是指定的字符串,包含html标签,用setText(Html.fromhtml(source))
可以去除其中的标签.
优点: 使用简单,Android自带方法,兼容性好
缺点:识别不了其中的图片标签
2 使用三参的fromHtml方法
Html.fromHtml(String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler);
其中三参的方法fromHtml
可以处理图片的问题,需要匿名内部类实现ImageGetter
,第三个参数可以设置null;
同时因为 ImageGetter
内部类是根据URL来获取网络图片填充富文本的,所以是一个耗时操作,需要放在子线程中实现,而TextView的setTest又是更新UI的操作,所以可以利用Handler,完整代码如下:
/**
* 声明Drawable的子类LevelListDrawable,
* 当然也可以用Drawable实现,不过我用Drawable写的时候,
* 加载出来的html图片会特别小,具体原因没有找到。
*/
private LevelListDrawable mDrawable = new LevelListDrawable();
TextView.setText(Html.fromHtml("Html片段", new Html.ImageGetter() {
@Override
public Drawable getDrawable(final String source) {
new Thread(new Runnable() {
@Override
public void run() {
mDrawable.addLevel(0, 0, getResources().getDrawable(R.mipmap.ic_launcher));
mDrawable.setBounds(0, 0, 200, 200);
Bitmap bitmap;
try {
// 将图片进行压缩,避免消耗内存过多
bitmap = BitmapFactory.decodeStream(new URL(source).openStream());
Message msg = handler.obtainMessage();
msg.what = 1233;
msg.obj = bitmap;
handler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
return mDrawable;
}
}, null));
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 1233:
bitmap = (Bitmap)msg.obj;
BitmapDrawable drawable = new BitmapDrawable(null, bitmap);
mDrawable.addLevel(1, 1, drawable);
mDrawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
mDrawable.setLevel(1);
CharSequence charSequence = question_text.getText();
question_text.setText(charSequence);
//通知重绘
question_text.invalidate();
break;
}
}
};
优点: Html标签兼容好,不会出现太多空白行间距问题
缺点:使用繁琐,相比第一种方法内存消耗较大
过滤图片URL并设置图片的点击事件
使用三参的方法fromHtml
,匿名内部类实现ImageGetter
,用第三个参数TagHandler
进行过滤图片URL并给图片添加点击事件;在第三个参数新建一个URLTagHandler
类,并实现Html.TagHandler
方法。重写handleTag
方法,在此方法里获取每张图片的地址。为图片设置点击事件。
具体代码如下:
private static class URLTagHandler implements Html.TagHandler {
private Context mContext;
public URLTagHandler(Context context) {
mContext = context.getApplicationContext();
}
@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
// 处理标签<img>
if (tag.toLowerCase(Locale.getDefault()).equals("img")) {
// 获取长度
int len = output.length();
// 获取图片地址
ImageSpan[] images = output.getSpans(len - 1, len, ImageSpan.class);
String imgURL = images[0].getSource();
// 使图片可点击并监听点击事件
output.setSpan(new URLTagHandler.ClickableImage(mContext, imgURL), len - 1, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
private class ClickableImage extends ClickableSpan {
private String url;
private Context context;
public ClickableImage(Context context, String url) {
this.context = context;
this.url = url;
}
@Override
public void onClick(View widget) {
// 进行图片点击之后的处理
Toast.makeText(context, "点击图片的地址" + url, Toast.LENGTH_LONG).show();
}
}
}
贴一个效果图:
当你在图片上滑动的时候会有点问题,应该时焦点的问题,目前还没找到解决办法。
最后
以上就是失眠马里奥为你收集整理的Android 富文本TextView的全部内容,希望文章能够帮你解决Android 富文本TextView所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复