android TextView 加载html 显示图片并且添加img标签点击事件工具类 富文本 图文混排 图片大小调整
注意,本人博客主要是为了自己记录,如果有问题欢迎反馈哈。
android的TextView可以加载html代码,并且识别他们的标签,用的方法就是setText(Html.fromHtml(source)),其中source是指定的字符串,包含html标签,用setText(Html.fromhtml(source))可以识别html标签(本人经常用其去除编辑遗漏的空格回车等标签),但是这种简单的做法并不能将其中的图片加载出来,其实图片也可以加载并且可以添加图片点击事件,如图片点击放大功能,效果图如下。
直接上工具类具体代码,其中有很多注释,写的很清楚,有不明白的或者有问题的欢迎评论。
import android.app.Activity; import android.content.Context; import android.graphics.drawable.Drawable; import android.text.Editable; import android.text.Html; import android.text.Html.TagHandler; import android.text.Spanned; import android.text.TextUtils; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.text.style.ImageSpan; import android.view.View; import android.widget.TextView; import android.widget.Toast; import org.xml.sax.XMLReader; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.Locale; /** * 将html设置到textview中的工具类 * textview有方法 setText(Html.fromHtml(source)),其中source是指定的字符串,包含html标签,用setText(Html.fromhtml(source))可以去除其中的标签,实际上是识别标签,但是这种简单的做法 * 并不能将其中的图片加载出来 * 此工具类可以将html代码中的img标签识别并进行图片资源请求 * 同时可以将img标签进行处理 添加上点击事件 */ public class HtmlFromUtils { /** * 网络请求获取图片 */ private static Drawable getImageFromNetwork(String imageUrl) { URL myFileUrl = null; Drawable drawable = null; try { myFileUrl = new URL(imageUrl); HttpURLConnection conn = (HttpURLConnection) myFileUrl .openConnection(); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); drawable = Drawable.createFromStream(is, null); is.close(); } catch (Exception e) { e.printStackTrace(); return null; } return drawable; } private static Drawable drawable; /** * 将html字符串中的图片加载出来 设置点击事件 然后TextView进行显示 * * @param context * @param v * @param sources */ public static void setTextFromHtml(final Activity context, final TextView v, final String sources) { if (TextUtils.isEmpty(sources) || context == null || v == null) return; synchronized (HtmlFromUtils.class) {//同步锁 v.setMovementMethod(LinkMovementMethod.getInstance());//如果想对img标签添加点击事件必须调用这句 使图片可以获取焦点 v.setText(Html.fromHtml(sources));//默认不处理图片先这样简单设置 new Thread(new Runnable() {//开启线程加载其中的图片 @Override public void run() { Html.ImageGetter imageGetter = new Html.ImageGetter() {//Html.fromhtml方法中有一个参数 就是ImageGetter 此类负责加载source中的图片 @Override public Drawable getDrawable(String source) { source = "http://www.dujiaoshou.com/" + source;//source就是img标签中src属性值,相对路径的此处可以对其进行处理添加头部 drawable = getImageFromNetwork(source); if (drawable != null) { int w = drawable.getIntrinsicWidth(); int h = drawable.getIntrinsicHeight(); //对图片大小进行等比例放大 此处宽高可自行调整 if (w < h && h > 0) { float scale = (400.0f / h); w = (int) (scale * w); h = (int) (scale * h); } else if (w > h && w > 0) { float scale = (1000.0f / w); w = (int) (scale * w); h = (int) (scale * h); } drawable.setBounds(0, 0, w, h); } else if (drawable == null) { //bindData(); return null; } return drawable; } }; //第三个参数 new URLTagHandler(context)负责添加img标签的点击事件 final CharSequence charSequence = Html.fromHtml(sources, imageGetter, new URLTagHandler(context)); //在activiy的runOnUiThread方法中更新ui context.runOnUiThread(new Runnable() { @Override public void run() { v.setText(charSequence); } }); } }).start(); } } /** * 此类负责处理source字符串中的img标签 对其添加点击事件 */ private static class URLTagHandler implements 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(); } } } }