富文本在TextView中显示图片

最近在项目中有需求使用到了富文本,在android中我们设置TextView显示富文本,如果不涉及图片的话还是比较简单的

TextView tv = new TextView(this);
Spanned spanned = Html.fromHtml(content);
tv.setText(spanned);

但是如果html中有图片的话就会出现以下情况,原本会出现图片的地方出现了空格:
富文本在TextView中显示图片_第1张图片

所以需要在填充富文本的时候对图片处理一下,Html中提供了两个方法

Html.fromHtml(String source);
Html.fromHtml(String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler);

其中三参的方法fromHtml可以处理图片的问题,需要匿名内部类实现 ImageGetter,第三个参数可以设置null;

同时因为 ImageGetter 内部类是根据URL来获取网络图片填充富文本的,所以是一个耗时操作,需要放在子线程中实现,而TextView的setTest又是更新UI的操作,所以可以利用Handler,完整代码如下:

private Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    CharSequence charSequence = (CharSequence) msg.obj;
                    if (charSequence != null) {
                        hotActivityContent.setText(charSequence);
                        hotActivityContent.setMovementMethod(LinkMovementMethod.getInstance());
                    }
                    break;
                default:
                    break;
            }
        }
};
private void setActivityContent(final String activityContent) {
        new Thread(new Runnable() {

            @Override
            public void run() {
                Html.ImageGetter imageGetter = new Html.ImageGetter() {

                    @Override
                    public Drawable getDrawable(String source) {
                        Drawable drawable;
                        drawable = ImageUtils.getInstance().getImageNetwork(source);
                        if (drawable != null) {
                            drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
                        } else if (drawable == null) {
                            return null;
                        }
                        return drawable;
                    }
                };
                CharSequence charSequence = Html.fromHtml(activityContent.trim(), imageGetter, null);
                Message ms = Message.obtain();
                ms.what = 1;
                ms.obj = charSequence;
                mHandler.sendMessage(ms);
            }
        }).start();
}
/**
     * 连接网络获得相对应的图片
     * @param imageUrl
     * @return
     */
public Drawable getImageNetwork(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();
            // 在这一步最好先将图片进行压缩,避免消耗内存过多
            Bitmap bitmap = BitmapFactory.decodeStream(is);
            drawable = new BitmapDrawable(bitmap);
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return drawable;
}

你可能感兴趣的:(Android)