上文中写了用ImageLoader实现图文混排中网络图片的显示,但是随后又发现了问题,网络加载慢时,会报空指针异常。如果给ImageLoader设置了默认图片的话,虽然不会报异常,但有时会一直显示默认图片,而不显示你所需要的网络图片。经过一番网络查找,找到一个能彻底解决问题的方法,下面例子中解决的是图文混排,加载网络图片,并将图片充满整个TextView的问题,示例如下:
package com.haier.online_shop.goodsdetail.contract; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.text.Html; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.haier.online_shop.goodsdetail.GoodsDetailActivity; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import com.orhanobut.logger.Logger; /** * Created by Administrator on 2016/10/29 0029. */ public class UrlImageGetter implements Html.ImageGetter { Context c; TextView container; public UrlImageGetter(TextView t,Context c){ this.c = c; this.container = t; } public Drawable getDrawable(String source){ final UrlDrawable urlDrawable = new UrlDrawable(); ImageLoader.getInstance().loadImage(source,new SimpleImageLoadingListener(){ @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage){ ViewGroup.LayoutParams params = container.getLayoutParams(); params.width = ViewGroup.LayoutParams.MATCH_PARENT; container.setLayoutParams(params); float scaleWidth = ((float) container.getMeasuredWidth())/loadedImage.getWidth(); Matrix matrix = new Matrix(); matrix.postScale(scaleWidth,scaleWidth); loadedImage = Bitmap.createBitmap(loadedImage,0,0,loadedImage.getWidth(),loadedImage.getHeight(),matrix,true); urlDrawable.bitmap = loadedImage; urlDrawable.setBounds(0,0,loadedImage.getWidth(),loadedImage.getHeight()); container.invalidate(); container.setText(container.getText()); } }); return urlDrawable; } public class UrlDrawable extends BitmapDrawable { protected Bitmap bitmap; @Override public void draw(Canvas canvas) { // override the draw to facilitate refresh function later if (bitmap != null) { canvas.drawBitmap(bitmap, 0, 0, getPaint()); } } } }
在Activity文件中调用:
Html.ImageGetter imageGetter = new UrlImageGetter(tvDetail,mContext);
tvDetail.setText(Html.fromHtml(data,imageGetter,null));即可。