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

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

相关文章

  • asp UTF-8 乱码问题的解决方法小结

    对于“asp UTF-8 乱码问题的解决方法小结”,我可以提供以下详细攻略,分为以下几部分: 1. 了解UTF-8编码问题 在ASP中,常用的字符串编码方式是GB2312,而UTF-8编码方式在国外网站中常用。如果在ASP中输出UTF-8编码的字符,在不作任何处理时,会出现乱码的问题。乱码产生的原因是由于ASP默认采用GB2312编码方式进行解析,而UTF-…

    html 2023年5月31日
    00
  • 请求转发jsp页面乱码问题的快速解决方法

    针对 “请求转发jsp页面乱码问题的快速解决方法”,我为你提供以下完整攻略: 问题描述 在JSP开发中,有时使用请求转发(forward)时,目标JSP页面出现了乱码的问题,造成页面无法正常显示。 解决方法 1. 统一编码格式 在JSP页面中添加以下代码,来设置页面的编码格式为UTF-8。 <%@ page language="java&qu…

    html 2023年5月31日
    00
  • mybatis中xml之trim属性说明

    MyBatis 是一款优秀的 ORM 框架,支持将 SQL 语句映射到 XML 文件中,而 XML 文件中的 SQL 语句又包含了很多属性进行配置。其中之一就是 <trim> 标签。 <trim> 标签 <trim> 标签用于在 SQL 语句中动态添加或删除一些字符串。它可以设置以下属性: prefix:在 <tri…

    html 2023年5月30日
    00
  • html5指南-1.html5全局属性(html5 global attributes)深入理解

    HTML5指南-1.HTML5全局属性深入理解 什么是HTML5全局属性? HTML5全局属性是可以用于所有HTML标签的属性。这些属性具有统一的语法、功能和意义,具有很高的通用性,可以用于任何HTML元素。 属性 描述 accesskey 规定激活元素的快捷键 class 规定元素的一个或多个类名(引用样式表中的类) contenteditable 规定元…

    html 2023年5月30日
    00
  • Spring Boot整合Thymeleaf详解

    让我们来详细讲解 Spring Boot 整合 Thymeleaf 的完整攻略。 步骤一:创建 Spring Boot 项目 首先,我们需要创建一个 Spring Boot 项目。可以使用 Spring Boot 官方提供的 Web 页面来生成项目:Spring Initializr。在这个页面中,我们需要填写一些基本的项目信息:项目名称、类型、包名,还可以…

    html 2023年5月30日
    00
  • Chia奇亚常见问题解答,CHIA奇亚到底怎么玩?

    以下是关于Chia奇亚的常见问题解答和攻略,包括以下几个方面: 什么是Chia奇亚? Chia奇亚是一种新型的数字货币,它使用存储空间而不是计算能力来进行挖矿。Chia奇亚的挖矿过程称为“种植”,它需要大量的硬盘空间和一定的计算能力。 如何开始玩Chia奇亚? 要开始玩Chia奇亚,您需要下载并安装Chia奇亚的官方客户端,并创建一个钱包地址。然后,您需要购…

    html 2023年5月17日
    00
  • touchscale屏幕电子秤如何操作 touchscale屏幕电子秤怎么打开

    以下是“touchscale屏幕电子秤如何操作 touchscale屏幕电子秤怎么打开”的完整攻略: touchscale屏幕电子秤如何操作?touchscale屏幕电子秤怎么打开? touchscale屏幕电子秤是一种高精度的电子秤,具有触摸屏幕和多种功能。下面是操作touchscale屏幕电子秤和打开的详细攻略。 操作touchscale屏幕电子秤 打开…

    html 2023年5月18日
    00
  • React详细讲解JSX和组件的使用

    对于“React详细讲解JSX和组件的使用”,可以分为以下几个部分进行讲解: 1. JSX的基本用法 JSX是一种JavaScript和XML的混合语法,用于在React中描述UI组件的结构和样式。在使用JSX时,需要注意以下几点: JSX语法类似于HTML,但是它是JavaScript代码,需要使用花括号{}来表示JSX内部的JavaScript表达式。 …

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