下面我会详细讲解"在Android TextView中显示图片的4种方式详解"。
一、前言
在Android开发中,TextView是常用的控件之一,而TextView中显示图片也是非常常见的需求。本篇文章就详细讲解如何在Android TextView中显示图片的4种方式。
二、四种显示图片的方式
1. 在TextView中使用HTML显示图片
的确,HTML是一种比较方便的方式来在TextView中显示图片。其核心代码如下:
Html.fromHtml("<img src='图片的地址'/>",ImageGetter, null)
其中,ImageGetter用于获取并处理图片资源,其定义如下:
Html.ImageGetter ImageGetter=new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
//获取本地图片
Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher_background);
//图片的边界处理
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
return drawable;
}
};
其中,ImageGetter.getDrawble方法就是获取并处理图片资源的过程。进一步优化,我们可以从网络上或本地上获取图片并做相关的处理。
public class HtmlImageGetter implements Html.ImageGetter {
private Context context;
private TextView textView;
private List<RequestHandle> handleList;
public HtmlImageGetter(Context context, TextView textView) {
this.context = context;
this.textView = textView;
handleList = new ArrayList<RequestHandle>();
}
@Override
public Drawable getDrawable(String source) {
final UrlDrawable drawable = new UrlDrawable();
// 加载图片
RequestHandle requestHandle = HttpUtil.getImage(source, new FileAsyncHttpResponseHandler(new File(context.getCacheDir(), UUID.randomUUID().toString())) {
@Override
public void onFailure(int i, Header[] headers, Throwable throwable, File file) {
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
textView.invalidate();
}
@Override
public void onSuccess(int i, Header[] headers, File file) {
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
Drawable drawables = new BitmapDrawable(bitmap);
drawable.setDrawable(drawables);
drawable.setBounds(0, 0, drawables.getIntrinsicWidth(), drawables.getIntrinsicHeight());
textView.invalidate();
}
});
handleList.add(requestHandle);
return drawable;
}
public void cancelAllTasks() {
for (RequestHandle handle : handleList) {
if (handle != null && !handle.isFinished()) {
handle.cancel(true);
}
}
handleList.clear();
}
}
2. SpannableString方式
SpannableString是Android中提供的一种富文本显示方式,不同于HTML,SpannableString的显示是基于字符的,不会废弃掉原有的TextView排版。在SpannableString中显示图片的方式也比较容易,核心代码如下:
SpannableString spannable = new SpannableString("你好");
Drawable drawable = getResources().getDrawable(R.drawable.icon);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
ImageSpan imageSpan = new ImageSpan(drawable);
spannable.setSpan(imageSpan, spannable.length() - "".length(), spannable.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannable);
在上述代码中,我们首先定义了一个SpannableString,并在其中添加要显示的图片。我们通过Drawable获取要显示的图片,并调用setBounds()方法设置图片的边界。接着调用SpannableString的setSpan()方法将图片添加至SpannableString中,并设置显示的位置。
同样的,我们可以根据不同的业务需求自定义ImageSpan进行图片的处理和显示。
3. 在TextView中使用RichText方式显示
RichText是作者封装的一种RichText显示方式,兼容API 15以上的所有系统。RichText可以用于在TextView中显示图片、表情、颜色、链接等。
要使用RichText可以通过引入以下库的方式:
implementation 'com.zzhoujay.richtext:richtext:3.0.0'
使用方式如下:
new UrlImageGetter(textView).execute("http://images.myprovence.fr/cdt13/phototheque/medias/2/7/9/27909w0.jpg");
RichText.from("Hello world!").placeHolder(R.drawable.ic_launcher_background).into(textView);
上述代码中,我们首先使用了UrlImageGetter获取网络上的图片,并通过RichText.from()方法传入要显示的文本,然后使用placeHolder()方法设置加载中的占位图片,最后调用into()方法将文本显示在TextView中。
4. 通过拓展TextView实现自定义View
如果上述方式不能满足需求的话,我们还可以使用自定义View的方式来实现TextView中显示图片的需求。
我们可以通过继承自TextView的方式来自定义一个TextView,并在其中添加要显示图片的逻辑,示例代码如下:
public class CustomTextView extends TextView {
private Drawable drawable;
public CustomTextView(Context context) {
this(context, null);
}
public CustomTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 设置图片
* @param drawable
*/
public void setDrawable(Drawable drawable) {
this.drawable = drawable;
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
invalidate();
}
/**
* 绘制图片
* @param canvas
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(drawable != null) {
int paddingLeft = getCompoundPaddingLeft();
int paddingTop = getCompoundPaddingTop();
canvas.drawBitmap(getBitmapFromDrawable(drawable), paddingLeft, paddingTop, getPaint());
}
}
/**
* Drawable 转 Bitmap
* @param drawable
* @return
*/
private Bitmap getBitmapFromDrawable(Drawable drawable) {
if(drawable == null) return null;
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
}
}
上述代码中,我们创建了一个CustomTextView,并通过setDrawable()方法设置要显示的图片。接着重写了onDraw()方法实现了要显示的逻辑,并实现了将Drawable转为Bitmap的方法。
使用时只需要将CustomTextView作为普通TextView使用,并调用setDrawable()方法即可。
总结
以上就是在Android TextView中显示图片的4种方式,比较适用于不同的业务场景。对于涉及到性能和体验要求高的场景,我们可以使用第三种方式,通过引入RichText库自定义TextView,在其中添加不同的需求逻辑,实现更加灵活的图片显示方案。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在Android TextView中显示图片的4种方式详解 - Python技术站