Android TextView Html加载图片Glide

Android TextView Html加载图片Glide

最近有个项目要使用很多次富文本加载的内容,因为不确定用户会输入什么富文本,提议的方案有2个,一个是WebView加载,还有一个方案是使用原生。WebView加载就不介绍了,使用原生,刚开始我是想自己解析富文本内容的,但是不确定因数太多,看看也要一定时间,最后采用了TextView加载富文本。
先上效果图:

这里写图片描述

图片地址:https://img.alicdn.com/imgextra/i3/2454452051/TB2DH1acYFkpuFjy1XcXXclapXa_!!2454452051.jpg

下面上代码:

String htmlText = introduction;
tvContent.setText(Html.fromHtml(htmlText, new URLImageParser(XXX.this, tvContent), null));
//tvContent.setMovementMethod(ScrollingMovementMethod.getInstance());// 设置可滚动 

看了很多资料,有一个图片加载方式是这样子的

ImageGetter imgGetter = new Html.ImageGetter() {  
        public Drawable getDrawable(String source) {  
            Log.i("RG", "source---?>>>" + source);  
            Drawable drawable = null;  
            URL url;  
            try {  
                url = new URL(source);  
                Log.i("RG", "url---?>>>" + url);  
                drawable = Drawable.createFromStream(url.openStream(), ""); // 获取网路图片  
            } catch (Exception e) {  
                e.printStackTrace();  
                return null;  
            }  
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),  
                    drawable.getIntrinsicHeight());  
            Log.i("RG", "url---?>>>" + url);  
            return drawable;  
        }  
    };  

这个方式当时验证的时候有点问题。
后来看了篇http://blog.csdn.net/dyllove98/article/details/9174261这篇博客看见了异步获取图片。好,开始动手,
由于自己框架使用的是Glide方式,所以就是一个glide异步获取图片的方式。下面上代码:

public class URLImageParser implements Html.ImageGetter {

    private Context context;
    private TextView tvContent;
    private int actX;//实际的宽  放大缩小基于textview的宽度
    private int actY;

    public URLImageParser(Context context, TextView tvContent) {
        this.context = context;
        this.tvContent = tvContent;
        //获取全屏大小
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        //我的textview有左右留边  margin
        actX = metrics.widthPixels - DensityUtil.dp2px(MainApplication.getContext(), 40);
        actY = metrics.heightPixels;
    }

    @Override
    public Drawable getDrawable(String source) {
        final URLDrawable urlDrawable = new URLDrawable();
        Glide.with(context)
                .load(source)
                .asBitmap()
                //.placeholder(R.drawable.default_duan)
                //.error(R.drawable.default_duan)
                //这里一定要这样,要拿到图片的实际高度,有没有Glide其他的加载方法就不说了,懒人直接拿来用就好了
                .into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onStart() {

                    }

                    @Override
                    public void onStop() {

                    }

                    @Override
                    public void onDestroy() {

                    }

                    @Override
                    public void onLoadStarted(Drawable placeholder) {

                    }

                    @Override
                    public void onLoadFailed(Exception e, Drawable errorDrawable) {
                        //加载失败就不管
                    }

                    @Override
                    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                        int x = resource.getWidth();
                        int y = resource.getHeight();
                        if (x > actX || y > actY) {
                            //进行等比例缩放程序
                            Matrix matrix = new Matrix();
                            matrix.postScale((float) (actX * 1.00 / x), (float) (actX * 1.00 / x));
                            //长和宽放大缩小的比例
                            resource = Bitmap.createBitmap(resource, 0, 0, x, y, matrix, true);
                        } 
                        urlDrawable.bitmap = resource;
                        urlDrawable.setBounds(0, 0, resource.getWidth(), resource.getHeight());
                        tvContent.invalidate();
                        tvContent.setText(tvContent.getText()); // 解决图文重叠
            }

                    @Override
                    public void onLoadCleared(Drawable placeholder) {

                    }


                    @Override
                    public void setRequest(Request request) {

                    }

                    @Override
                    public Request getRequest() {
                        return null;
                    }
                });
        return urlDrawable;
    }

    public class URLDrawable extends BitmapDrawable {
        protected Bitmap bitmap;

        @Override
        public void draw(Canvas canvas) {
            if (bitmap != null) {
                canvas.drawBitmap(bitmap, 0, 0, getPaint());
            }
        }
    }
}

这里一定要注意onResourceReady()方法里是基于图片缩放的得到的新的图片拿来设置的,开始的时候一直是urlDrawable.setBounds(0, 0, actX, (int)(x / actX * y));拿到的图片一直显示不全,总是少了一部分,试了N多方法,后来想起是不是图片的大小没变,果然拿来之后缩放了图片,OK了。至于其他图片的异步加载框架就不说了,重复onResourceReady()里方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值