1. 程式人生 > >富文字在TextView中顯示圖片

富文字在TextView中顯示圖片

最近在專案中有需求使用到了富文字,在android中我們設定TextView顯示富文字,如果不涉及圖片的話還是比較簡單的

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

但是如果html中有圖片的話就會出現以下情況,原本會出現圖片的地方出現了空格:
這裡寫圖片描述

所以需要在填充富文字的時候對圖片處理一下,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;
}