android Html img 标签解析

    Html.fromHtml(url,imageGetter,TagHandler)重写ImageGetter 异步加载图片,加载图片之后重置TextView(EditView)的内容。
    参数说明:source=需要展示的html文本内容,imageGetter=需要继承Html.ImageGetter接口实现逻辑,tagHandler=这个参数表示,当textView解析遇到无法识别的html标签是否发送通知或者消息,如果遇到无法解析的标签,该方法将会被调用。这个没有具体测试过,一般赋值null。
    问题:1网络图片的加载不能阻塞主线程,因此需要异步加载 (ImageLoader 会好些 有缓存机制)
     2加载图片之后无法正常显示(偏小)  (使用Drawable.createFromResourceStream)
     3重新设置图片大小之后在个别系统上会出现图片错位(这个暂时无法解决,还望有解决办法的共享一下解决思路)(没复现)





代码:
 UrlDrawable :可以让你加载图片的时候显示初始的图片,也就是加载中的图片。 
 public class URLDrawable extends BitmapDrawable {
    // the drawable that you need to set, you could set the initial drawing  
    // with the loading image if you need to  
    protected Drawable drawable;

    @Override
    public void draw(Canvas canvas) {
        // override the draw to facilitate refresh function later  
        if(drawable != null) {
            drawable.draw(canvas);
        }
    }
}  
 UrlParser :重写ImageGetter.
    public class URLImageParser implements Html.ImageGetter {
    Context context;
    EditText container;

    /***
     * 构建URLImageParser将运行AsyncTask,刷新容器
     * @param editText
     * @param c
     */
    public URLImageParser(EditText editText, Context c) {
        this.context = c;
        this.container = editText;
    }

    public Drawable getDrawable(String source) {
        URLDrawable urlDrawable = new URLDrawable();

        //TODO ImageLoader
        // 获得实际的源
        ImageGetterAsyncTask asyncTask = new ImageGetterAsyncTask( urlDrawable);

        asyncTask.execute(source);

        //返回引用URLDrawable将改变从src与实际图像标记
        return urlDrawable;
    }

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

        public ImageGetterAsyncTask(URLDrawable drawable) {
            this.urlDrawable = drawable;
        }

        @Override
        protected Drawable doInBackground(String... params) {
            String source = params[0];
            return fetchDrawable(source);
        }

        @Override
        protected void onPostExecute(Drawable result) {
            // 设置正确的绑定依据HTTP调用的结果
            if(result != null){

                urlDrawable.setBounds(0, 0, result.getIntrinsicWidth(), result.getIntrinsicHeight());
                urlDrawable.drawable = result;

                // 绘制图像容器
                URLImageParser.this.container.invalidate();

                URLImageParser.this.container.setHeight(URLImageParser.this.container.getHeight() + result.getIntrinsicHeight());

                URLImageParser.this.container.setEllipsize(null);

            }
        }

        /***
         * 得到Drawable的URL
         *
         * @param urlString
         * @return
         */
        public Drawable fetchDrawable(String urlString) {
            try {
                URL url = new URL(urlString);
                //使用Drawable.createFromResourceStream可以使图片按原图大小展示出来不会出现加载后图片变小的情况  ,使用Drawable.createFromStream会。
                Drawable drawable = Drawable.createFromResourceStream(context.getResources() , null ,url.openStream(), "src", null);
                if(drawable!= null){
                    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                    return drawable;
                }else{
                    return null;
                }
            } catch (Exception e) {
                return null;
            }
        }
    }
}
使用textView加载带网络图片的html内容需求是可以实现的,但是由于html支持的标签有限,自己实现会很复杂,例如自定义字体颜色、span标签等都不能很好的支持,所以选择了webview展示,相对于EditView来说,不可编辑但是展示效果和处理比EditView的效果好,不需要自己写需要解析的标签(坑)。图文并茂的页面还是使用webView比较好,但是webView是不是就完美解决了呢?然而并不是,毕竟webView加载页面是页面的内容,效果没有Android原生的好,同事使用webView加载页面在Android系统4.4+开始滑动页面会有明显的卡顿和跳帧,有些简直无法接受。
使用腾讯X5SDK优化webView加载腾讯X5SDK能够加速webView加载,优化滑动卡顿,效果还是比较明显的(没测),只是使用条件比较苛刻,在国内使用的APP还是可以考虑。



实现图文混排的另一种方式,不是对img标签
1.spanString 
     (http://blog.csdn.net/feizhixuan46789/article/details/10334441)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值