Android TextView Html ImageGetter 图片位置不对

TextView 显示Html的方法:

textView.setText(Html.fromHtml(string))
 

Tags supported by Android

  • <p>
  • <div> handled exactly like <p>
  • <br>
  • <b>
  • <i>
  • <strong> 
  • <em> 
  • <u>
  • <tt>
  • <dfn>
  • <sub>
  • <sup>
  • <blockquote>
  • <cite>
  • <big>
  • <small>
  • <font size="..." color="..." face="...">
  • <h1><h2><h3><h4><h5><h6>
  • <a href="...">
  • <img src="...">

推荐一个开源项目,支持Html的TextView,添加了几个Tags的支持:

Extended support by HtmlTextView

  • <ul>
  • <ol>
  • <li>
  • <code>
  • <center>
  • <strike>
使用这个项目基本能正常显示以上的Html tags。

但是显示图片位置不对,相信很多人遇到这个问题。

TextView显示图片都要自己写个ImageGetter的类,如果图片位置不对,可以试试这行代码,在onPostExecute里面加上
 
((HtmlTextView)container).setText(((HtmlTextView) container).getText());

完整类:
 
package org.sufficientlysecure.htmltextview;

import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.text.Html.ImageGetter;
import android.util.Log;
import android.view.View;

import com.example.administrator.bbcodetest.R;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URL;

public class HtmlRemoteImageGetter implements ImageGetter {
    Context c;
    View container;
    URI baseUri;

    /**
     * Construct the URLImageParser which will execute AsyncTask and refresh the container
     */
    public HtmlRemoteImageGetter(View t, Context c, String baseUrl) {
        this.c = c;
        this.container = t;
        if (baseUrl != null) {
            this.baseUri = URI.create(baseUrl);
        }
    }

    public Drawable getDrawable(String source) {
        UrlDrawable urlDrawable = new UrlDrawable();
        ImageGetterAsyncTask asyncTask = new ImageGetterAsyncTask(urlDrawable);

        asyncTask.execute(source);

        // return reference to URLDrawable which will asynchronously load the image specified in the src tag
        return urlDrawable;
    }

    public class ImageGetterAsyncTask extends AsyncTask<String, Void, Drawable> {
        UrlDrawable urlDrawable;
        String source;

        public ImageGetterAsyncTask(UrlDrawable d) {
            this.urlDrawable = d;
        }
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(final Drawable result) {
            if (result == null) {
                Log.w(HtmlTextView.TAG, "Drawable result is null! (source: " + source + ")");
                return;
            }
            // set the correct bound according to the result from HTTP call
//            urlDrawable.setBounds(0, 0, 0 + result.getIntrinsicWidth(), 0 + result.getIntrinsicHeight());

            // change the reference of the current drawable to the result from the HTTP call
            urlDrawable.drawable = result;

            // redraw the image by invalidating the container
            urlDrawable.invalidateSelf();
            HtmlRemoteImageGetter.this.container.invalidate();
            // important
            <span style="color:#ff0000;">((HtmlTextView)container).setText(((HtmlTextView) container).getText());
</span>        }
		
		@Override
        protected Drawable doInBackground(String... params) {
            source = params[0];
            return fetchDrawable(source);
        }
        /**
         * Get the Drawable from URL
         */
        public Drawable fetchDrawable(String urlString) {
            try {
                InputStream is = fetch(urlString);
                Bitmap bitmap= BitmapFactory.decodeStream(is);
                Drawable drawable = new BitmapDrawable(c.getResources(), bitmap);
                int width = bitmap.getWidth();
                int height = bitmap.getHeight();

                int newWidth = width;
                int newHeight = height;

                if( width > container.getWidth() ) {
                    newWidth = container.getWidth();
                    newHeight = (newWidth * height) / width;
                }

                drawable.setBounds(0, 0, 0 + newWidth, 0 + newHeight);
                urlDrawable.setBounds(0, 0, newWidth, newHeight);
                return drawable;
            } catch (Exception e) {
                return null;
            }
        }

        private InputStream fetch(String urlString) throws IOException {
            URL url;
            if (baseUri != null) {
                url = baseUri.resolve(urlString).toURL();
            } else {
                url = URI.create(urlString).toURL();
            }

            return (InputStream) url.getContent();
        }
    }

    @SuppressWarnings("deprecation")
    public class UrlDrawable extends BitmapDrawable {
        protected Drawable drawable;

        @Override
        public void draw(Canvas canvas) {
            // override the draw to facilitate refresh function later
            if (drawable != null) {
                drawable.draw(canvas);
            }
        }
    }
} 

 

 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android 中,可以通过以下两种方式在 TextView 中显示图片: 1. 使用 HTML 标记 可以在 TextView 中使用 HTML 标记来显示图片。具体做法如下: 在 strings.xml 中定义一个包含 HTML 标记的字符串: ```xml <string name="html_text">这是一个包含图片的文本:<br><img src="android.resource://com.example.app/drawable/ic_launcher"/></string> ``` 在代码中获取该字符串,并将其设置给 TextView: ```java textView.setText(Html.fromHtml(getString(R.string.html_text))); ``` 其中,`android.resource://com.example.app/drawable/ic_launcher` 是图片的路径,需要根据实际情况进行修改。 2. 使用 SpannableString 使用 SpannableString 可以在 TextView插入图片,并且可以控制图片的大小和位置。具体做法如下: ```java SpannableString spannableString = new SpannableString("这是一个包含图片的文本:"); Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); spannableString.setSpan(imageSpan, spannableString.length() - 1, spannableString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); textView.setText(spannableString); ``` 其中,`R.drawable.ic_launcher` 是图片的资源 ID,需要根据实际情况进行修改。`setBounds()` 方法用于设置图片的大小和位置,`ALIGN_BASELINE` 表示将图片和基线对齐。`setSpan()` 方法用于将图片插入到 SpannableString 中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值