在Android TextView中显示图片的4种方式详解


Warning: Undefined array key "name" in /www/wwwroot/pythonjishu_web/wp-content/themes/justnews/themer/functions/shortcodes-render.php on line 40

Warning: Undefined array key "name" in /www/wwwroot/pythonjishu_web/wp-content/themes/justnews/themer/functions/shortcodes-render.php on line 40

下面我会详细讲解"在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技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • iphone6出现乱码是怎么回事?解决苹果6乱码方法步骤

    iPhone6出现乱码的原因 通常出现乱码的原因有以下几点: 字体兼容性问题:在浏览网页或者在某些应用程序中,系统会加载不同的字体文件。如果这些字体文件与设备不兼容,就会出现乱码的问题。 编码方式不匹配:有些网页或者应用程序使用的字符编码方式与系统的编码方式不匹配,也会导致乱码的情况。 软件版本问题:有些时候,某些软件的版本过低或过高也会导致出现乱码问题。 …

    html 2023年5月31日
    00
  • 解决Linux系统下终端setup显示乱码

    下面是详细的攻略步骤: 1. 确认终端编码 首先需要确认终端所使用的编码方式,可以使用以下命令查看: echo $LANG 该命令会输出一个类似于”en_US.UTF-8″的字符串,其中”.UTF-8″表示终端使用的编码方式为UTF-8。如果该值为其他编码方式,需要修改为UTF-8编码。 2. 修改终端编码 如果终端编码不是UTF-8,则需要修改编码方式。以…

    html 2023年5月31日
    00
  • innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解

    下面我来详细讲解“innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解”。 一、innerHTML属性 innerHTML是DOM元素的一个属性,用于获取或设置该元素内部的HTML内容。 获取元素内部的HTML内容 <div id="myDiv"> <p>这是一…

    html 2023年5月30日
    00
  • MYSQL数据库导入数据时出现乱码的解决办法

    下面是MYSQL数据库导入数据时出现乱码的解决办法的完整攻略: 问题描述 在使用MYSQL数据库导入数据时,有可能会出现数据中出现乱码的情况。乱码通常会在数据为中文或其他非西欧语言时出现,导致数据的完整性受到影响。 解决办法 1. 修改MYSQL字符集 首先要检查MYSQL的字符集是否正确设置。可以通过以下步骤来修改MYSQL字符集: 登录MYSQL数据库 …

    html 2023年5月31日
    00
  • Android XML文件中的@、?、@+的该怎么理解?

    XML(Extensible Markup Language)是一种用于存储和传输数据的标记语言,主要应用于各种XML配置文件,例如Android中的布局文件、字符串资源等。 在 Android XML 文件中,我们有时会看到一些特殊符号,例如 @、?、@+ 等,这些符号是用于引用资源的。 下面,我们来详细讲解这些符号的用法及含义: @ 符号 @ 符号用于引…

    html 2023年5月30日
    00
  • hlp是什么文件格式?.hlp文件怎么打开?

    hlp是什么文件格式? HLP是Windows帮助文件的文件格式,它是一种二进制文件格式,用于存储Windows应用程序的帮助文档。HLP文件通常包含应用程序的用户手册、帮助文档和其他相关信息。 .hlp文件怎么打开? 如果您需要打开.hlp文件,可以按照以下步骤操作: 使用Windows自带的帮助查看器:Windows自带了一个帮助查看器,可以用来打开.h…

    html 2023年5月17日
    00
  • PHP实现对xml进行简单的增删改查(CRUD)操作示例

    接下来我将为您详细讲解PHP如何实现对XML进行增删改查操作的完整攻略。 一、XML简介及基本操作 XML,全称可扩展标记语言,是一种标记语言,用于将数据进行存储和传输。在XML文件中,使用标签来存储信息。常用的几个标记如下: <?xml version="1.0" encoding="UTF-8"?> &…

    html 2023年5月30日
    00
  • 解决dotproject中文名文件下载乱码问题的解决方法

    解决dotproject中文名文件下载乱码问题的解决方法 在 dotproject 中出现中文名文件下载乱码问题的原因是因为浏览器默认使用 ASCII 编码,而中文名文件使用 UTF-8 编码。下面给出两种解决方法。 方法一:修改源代码 修改 /dotproject/classes/ui.class.php 文件,将该文件中的所有 filename= 换成 …

    html 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部