注意,本人博客主要是为了自己记录,如果有问题欢迎反馈哈。

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) {            // 处理标签            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();            }        }    }}
 

更多相关文章

  1. Android(安卓)自定义SwitchButton开关控件
  2. Android基于nfc的读写(一)
  3. android xml布局之———include.merge.ViewStub
  4. Android(安卓)样式的开发
  5. Android(安卓)Webview组件使用总结
  6. Android(安卓)使用ViewPager实现左右循环滑动图片
  7. Android(安卓)切换卡(TabWidget)
  8. android .9图讲解
  9. android 阻尼效果(图片下拉变大)

随机推荐

  1. 2020年,那些已经死亡的公司
  2. Apache Spark 背后公司 Databricks 完成F
  3. 给你梳理了 44 个 CSS 精选知识点
  4. Vue自学之路4-vue模版语法(v-clock)
  5. DolphinDB模块复用教程
  6. 第五课 实例演示flex容器中的四个属性的
  7. 宝塔面板非https站点使用https访问跳转其
  8. grid的描述
  9. 排查指南 | 当 mPaaS 小程序提示“应用更
  10. 技术干货 | mPaaS 框架下如何使用 Crash