TextView加载富文本(图片对齐)

/**
* TextView加载带图片html文字
*/
static class HtmlTask extends AsyncTask<String, Integer, Spanned> {
WeakReference<TextView> v;
int lineSpacingExtra;

    public HtmlTask(TextView v) {
        this.v = new WeakReference<>(v);
        lineSpacingExtra = (int) v.getLineSpacingExtra();
    }

    @Override
    protected Spanned doInBackground(String... strings) {
        Spanned spanned = Html.fromHtml(strings[0], new Html.ImageGetter() {
            @Override
            public Drawable getDrawable(String source) {
                InputStream is = null;
                try {
                    is = (InputStream) new URL(source).getContent();
                    Drawable d = Drawable.createFromStream(is, "src");
                    d.setBounds(0, 0, d.getIntrinsicWidth(),
                            d.getIntrinsicHeight());
                    is.close();
                    return d;
                } catch (Exception e) {
                    if (is != null) {
                        try {
                            is.close();
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                    }
                    return null;
                }
            }
        }, null);
        if (spanned instanceof SpannableStringBuilder) {
            ImageSpan[] imageSpans = spanned.getSpans(0, spanned.length(), ImageSpan.class);
            for (ImageSpan imageSpan : imageSpans) {
                int start = spanned.getSpanStart(imageSpan);
                int end = spanned.getSpanEnd(imageSpan);
                Drawable d = imageSpan.getDrawable();
                ImageSpan newImageSpan = new StickerSpan(d, ImageSpan.ALIGN_BASELINE, lineSpacingExtra);
                ((SpannableStringBuilder) spanned).setSpan(newImageSpan, start, end, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
                ((SpannableStringBuilder) spanned).removeSpan(imageSpan);
            }
        }

        return spanned;
    }

    @Override
    protected void onPostExecute(Spanned spanned) {
        if (v.get() != null) {
            v.get().setText(spanned);
        }
    }
}

/**
 * 让html中图片和文字对齐
 */
static class StickerSpan extends ImageSpan {
    int lineSpacingExtra;

    StickerSpan(Drawable b, int verticalAlignment, int lineSpacingExtra) {
        super(b, verticalAlignment);
        this.lineSpacingExtra = lineSpacingExtra;
    }

    @Override
    public void draw(Canvas canvas, CharSequence text,
                     int start, int end, float x,
                     int top, int y, int bottom, Paint paint) {
        Drawable b = getDrawable();
        canvas.save();
        int transY = bottom - b.getBounds().bottom - lineSpacingExtra;
        if (mVerticalAlignment == ALIGN_BASELINE) {
            int textLength = text.length();
            for (int i = 0; i < textLength; i++) {
                if (Character.isLetterOrDigit(text.charAt(i))) {
                    transY -= paint.getFontMetricsInt().descent;
                    break;
                }
            }
        }
        canvas.translate(x, transY);
        b.draw(canvas);
        canvas.restore();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,535评论 0 17
  • 1: 获取控件宽高 控件View有getHeight()和getwidth()方法可以获取宽高,但是如果直接在on...
    自由人是工程师阅读 1,839评论 0 0
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,288评论 0 16
  • 摘录:模糊痕迹理论认为记录一段新的记忆是在神经元之间调整并且建立新的联系来记住的,并不是创造出了新的神经元细胞。我...
    微笑向日葵_88f8阅读 104评论 0 0
  • 昨天晚上回来,洗完澡后躺在床上看着小说,一边想,我现在想过的生活就是住的一个附近有阅览室的地方,里面各种人群,上...
    晨风er阅读 205评论 0 1