android textview 加载html 显示图片

2017-12-11  本文已影响24人  S晔枫

需求: TextView中显示html 还要展示上面的图片, 文字还好解决 直接调用

// html要显示的文字
textView.setText(Html.fromHtml(html));

坑的是里面还要显示图片, 而且还不确定图片的位置, 折腾了大半天, 在网上找到一个比较比较靠谱的方法, 特此记录 :

    @Deprecated
      // 用到的方法   从提供的HTML字符串中返回可显示样式的文本,并使用遗留标记
      public static Spanned fromHtml(String source, ImageGetter imageGetter,TagHandler tagHandler) {
        return fromHtml(source, FROM_HTML_MODE_LEGACY, imageGetter, tagHandler);
}

好了 直接上代码 (ps: 可拿去直接用)
自定义ImageGetter类

public class MyImageGetter implements Html.ImageGetter {
private Context context;
String data;// 要加载的html内容 
TextView tv;// 加载html内容的TextView控件
public MyImageGetter (Context context, TextView tv,
                          String data) {
    this.context = context;
    this.tv = tv;
    this.data = data;
}

@Override
// 主要是重写此方法
public Drawable getDrawable(String source) {
    Drawable drawable = null;
    if (source != null && source.length() > 0) {
        // 截取图片名称   可根据自己的实际情况选择
        String imgName = source.substring(33, source.length());
        // 图片地址  我这因为后台返回的是相对地址 需要我自己拼接
        final String imgUrl= NetWork.BASE_URL + source.substring(2, source.length());
        File file = new File(Environment.getExternalStorageDirectory(), imgName);
        if (file.exists()) {
            drawable = Drawable.createFromPath(file.getAbsolutePath());
            if (drawable != null) {
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth() * 2, drawable.getIntrinsicHeight() * 2);
            }
        } else {
            VolleyUtils.getNetworkImg(context, imgUrl, imgName, tv, data, this);
        }
    }
    return drawable;
}
}

下载图片 VolleyUtils 类

public class VolleyUtils {
/**
 * 通过volley请求网络图片
 * @param url
 */
public static void getNetworkImg(Context context, String url, final String name, final TextView tv,
                           final String data, final NetWorkImageGetter mNetWorkImageGetter) {
    RequestQueue queue = Volley.newRequestQueue(context);
    ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {
        @Override
        public void onResponse(Bitmap bitmap) {
            saveMyBitmap(name, bitmap);
            tv.setText(Html.fromHtml(data, mNetWorkImageGetter, null));
        }
    }, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.RGB_565, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
        }
    });
    queue.add(request);
}

/**
 * 保存获取到的网络图片到sdcard
 * @param bitName
 * @param mBitmap
 */
public static void saveMyBitmap(String bitName, Bitmap mBitmap) {
    File f = new File("/sdcard/" + bitName);
    try {
        f.createNewFile();
    } catch (IOException e) {
    }
    FileOutputStream fOut = null;
    try {
        fOut = new FileOutputStream(f);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
    try {
        fOut.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        fOut.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

使用 实例:

        MyImageGetter imageGetter = new MyImageGetter (this,
                textView, html);
        textView.setText(Html.fromHtml(html, imageGetter, null));

整个逻辑 : 先判断本地是否存在对应的图片-->有 直接显示 -->没有从网上下载并保存到本地 .

上一篇下一篇

猜你喜欢

热点阅读