汇总——TextView使用Glide极速加载HTML复文本中的图片

一、TextView中HTML文本的显示
显示普通HTML文本
TextView.setText(Html.fromHtml(reasonstr, null, null));

显示带图片的HTML文本

TextView.setText(Html.fromHtml(reasonstr, imgGetter , null));

二、HTML文本中图片的异步加载
Android 4.0以后的最大特性—不允许使用UI线程进行耗时操作,导致了下面方法的失效
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_blog_view);


    Intent intent = getIntent();
    Uri blogUri = intent.getData();
    mPost = blogUri.toString();
    mUrl = getIntent().getStringExtra("mUrl");


    TextView textView = (TextView) findViewById(R.id.scrollView1);
    textView.setText(Html.fromHtml(mPost, imgGetter, null));
}


private ImageGetter imgGetter = new ImageGetter(){
    @Override
    public Drawable getDrawable(String source){
         Drawable drawable = Drawable.createFromPath(source);
        try {
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        }catch (NullPointerException e){
            logException(e);
        }
        return drawable;
    }
};


解决办法:一


AsyncTask(效率不高)
 
   class HtmlImageGetter implements Html.ImageGetter {
        final double windowsWidth = getWindowManager().getDefaultDisplay().getWidth() - txt_reason.getPaddingLeft() - txt_reason.getPaddingRight();


        /**
         * 获取图片
         */
        @Override
        public Drawable getDrawable(String source) {
            LevelListDrawable d = new LevelListDrawable();
            Drawable empty = getResources().getDrawable(
                    R.drawable.subject_dateil);
            d.addLevel(0, 0, empty);
            d.setBounds(0, 0, (int) windowsWidth,
                    empty.getIntrinsicHeight());
            new LoadImage().execute(source, d);
            return d;
        }


        /**
         * 异步下载图片类
         */
        class LoadImage extends AsyncTask<Object, Void, Bitmap> {


            private LevelListDrawable mDrawable;


            @Override
            protected Bitmap doInBackground(Object... params) {
                String source = (String) params[0];
                mDrawable = (LevelListDrawable) params[1];
                try {
                    InputStream is = new URL(source).openStream();
                    return BitmapFactory.decodeStream(is);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }


            /**
             * 图片下载完成后执行
             */
            @Override
            protected void onPostExecute(Bitmap bitmap) {
                if (bitmap != null) {
                    BitmapDrawable d = new BitmapDrawable(bitmap);
                    mDrawable.addLevel(1, 1, d);
                    /**
                     * 适配图片大小
                     * 默认大小:bitmap.getWidth(), bitmap.getHeight()
                     * 适配屏幕:getDrawableAdapter
                     */
                    mDrawable = getDrawableAdapter(StrollDetailActivity.this, mDrawable,
                            bitmap.getWidth(), bitmap.getHeight());


                    mDrawable.setLevel(1);


                    /**
                     * 图片下载完成之后重新赋值textView
                     *
                     */
                    txt_reason.invalidate();
                    CharSequence t = txt_reason.getText();
                    txt_reason.setText(t);


                }
            }


            /**
             * 加载网络图片,适配大小
             *
             * @param context
             * @param drawable
             * @param oldWidth
             * @param oldHeight
             *
             * @return
             */
            public LevelListDrawable getDrawableAdapter(Context context,
                                                        LevelListDrawable drawable, int oldWidth, int oldHeight) {
                LevelListDrawable newDrawable = drawable;
                long newHeight = 0;// 未知数
                int newWidth = (int) windowsWidth;// 默认屏幕宽
                newHeight = (newWidth * oldHeight) / oldWidth;
                newDrawable.setBounds(0, 0, newWidth, (int) newHeight);
                return newDrawable;
            }
        }


    }




解决办法:二(推荐)

Glide加载

    Html.ImageGetter imageGetter = new Html.ImageGetter() {


        public Drawable getDrawable(String source) {
            final LevelListDrawable mDrawable = new LevelListDrawable();
            final double windowsWidth = getWindowManager().getDefaultDisplay().getWidth() - txt_reason.getPaddingLeft() - txt_reason.getPaddingRight();
            URL url;


            Glide.with(StrollDetailActivity.this).load(source).asBitmap().placeholder(R.drawable.subject_dateil).into(new SimpleTarget<Bitmap>() {
                @Override
                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                    BitmapDrawable d = new BitmapDrawable(resource);
                    mDrawable.addLevel(1, 1, d);
                    double scale = (double) resource.getHeight() / (double) resource.getWidth();
                    int imgHeight = (int) (scale * windowsWidth);
                    int imgWidth = (int) windowsWidth;
                    mDrawable.setBounds(0, 0, imgWidth, imgHeight);
                    mDrawable.setLevel(1);
                    /**
                     * 图片下载完成之后重新赋值textView
                     *
                     */
                    txt_reason.invalidate();
                    txt_reason.setText(txt_reason.getText());
                }
            });
            return mDrawable;
        }


    };


用的LevelListDrawable 能自动重新绘制画布 需要加上 mDrawable.setLevel(1);


解决方法:三
http://blog.csdn.net/maosidiaoxian/article/details/41673425
推荐链接: http://blog.csdn.net/fancylovejava/article/details/17930013
http://stackoverflow.com/questions/16179285/html-imagegetter-textview

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值