IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 实现图文混排 -> 正文阅读

[移动开发]Android 实现图文混排

Android 实现图文混排

需求:

  1. 在文字中间添加图片或者在文字后面添加图片;
  2. 文字换行后,图片在第二行的后面;
  3. 图片加点击事件,文字没有点击事件。

实现方案:

  • 使用TextView + Imageview实现,第1点好实现,第2点不好搞;
  • 自定义TextView实现;
  • 使用ImageSpan + TextView实现。

今天说的是第三种实现:使用ImageSpan + TextView实现

效果图:
在这里插入图片描述

跨度标志:

  • Spannable.SPAN_EXCLUSIVE_EXCLUSIVE //前后都不包括
  • Spannable.SPAN_INCLUSIVE_EXCLUSIVE //前包括后不包括
  • Spannable.SPAN_EXCLUSIVE_INCLUSIVE //前不包括后包括
  • Spannable.SPAN_INCLUSIVE_INCLUSIVE //前后都包括

实现方法:

/**
     * 设置图片和文本
     */
    private fun setEndImageSpan(textView: TextView) {
        val mEndImageSpan = ImageSpan(this, R.drawable.ic_device_selected, DynamicDrawableSpan.ALIGN_CENTER)
        val text = textView.text.toString()
        val mSpan = SpannableStringBuilder("$text ").apply {
            setSpan(mEndImageSpan, length - 1, length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
        }
        //声明点击事件
        val mClickableSpan = object : ClickableSpan() {
            override fun onClick(widget: View) {
                //点击时背景色设置为透明
                (widget as TextView).highlightColor =
                        resources.getColor(android.R.color.transparent)
            }
        }
        //添加点击事件和点击事件的位置
        mSpan.setSpan(mClickableSpan, mSpan.length - 1, mSpan.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
        textView.text = mSpan
        //需要设置movementMethod,否则mClickableSpan不生效
        textView.movementMethod = LinkMovementMethod.getInstance()
    }

特别注意:
1、$text 后面有空格,这是为了避免图片把最后一个字符替换掉,根据需求确认是否加空格。
2、图片点击时会有背景变色的点击效果,这里设置为透明。
3、设置textView.movementMethod = LinkMovementMethod.getInstance(),否则点击事件不生效。
4、图片居中问题,我现在设置的DynamicDrawableSpan.ALIGN_CENTER,想要要的效果是图片居中,但是上面显示的图片并没有居中。

解决图片居中问题:新建类继承ImageSpan,重写draw和getSize方法

package com.fht.kotlin.widget

import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.text.style.ImageSpan
import androidx.annotation.DrawableRes


/**
 * @author fenghaitao
 * @time 2021/12/4 09:20
 */
class ImageCenterSpan constructor(context: Context, @DrawableRes resourceId: Int, aligin: Int)
    : ImageSpan(context, resourceId, aligin) {
    private var aligin: Int = ALIGN_CENTER //默认居中

    init {
        this.aligin = aligin
    }

    override fun draw(canvas: Canvas, text: CharSequence?, start: Int,
            end: Int, x: Float, top: Int, y: Int, bottom: Int, paint: Paint) {
        val b = drawable
        canvas.save()
        var transY = ((bottom - top) - b.bounds.bottom) / 2 + top
        if (aligin == ALIGN_BASELINE) {
            transY -= paint.fontMetricsInt.descent
        } else if (aligin == ALIGN_BOTTOM) {
            transY = bottom - b.bounds.bottom
        }
        canvas.translate(x, transY.toFloat())
        b.draw(canvas)
        canvas.restore()
    }

    override fun getSize(paint: Paint, text: CharSequence?, start: Int,
                         end: Int, fm: Paint.FontMetricsInt?): Int {
        val d = drawable
        val rect = d.bounds
        if (fm != null) {
            val fmPaint = paint.getFontMetricsInt()
            val fontHeight = fmPaint.bottom - fmPaint.top
            val drHeight = rect.bottom - rect.top
            val top = drHeight / 2 - fontHeight / 4
            val bottom = drHeight / 2 + fontHeight / 4
            
            fm.ascent = -bottom
            fm.top = -bottom
            fm.bottom = top
            fm.descent = top
        }
        return rect.right
    }
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-14 16:03:59  更:2021-12-14 16:05:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:57:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码