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.widgetimport 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 = drawablecanvas.save()var transY = ((bottom - top) - b.bounds.bottom) / 2 + topif (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 = drawableval rect = d.boundsif (fm != null) {val fmPaint = paint.getFontMetricsInt()val fontHeight = fmPaint.bottom - fmPaint.topval drHeight = rect.bottom - rect.topval top = drHeight / 2 - fontHeight / 4val bottom = drHeight / 2 + fontHeight / 4fm.ascent = -bottomfm.top = -bottomfm.bottom = topfm.descent = top}return rect.right}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35257.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA2020 安装教程,图文教程

1、下载IDEA 首先在官网下载IDEA,官网下载地址为:IDEA下载地址 我这里选择的是Ultimate版本 IDEA各版本的区别: Community 社区版,免费,但是功能有限制,Android Studio就是基于这个版本定制的。 Ultimate …

手机剪映app图文成片功能怎么用

剪映作为一款简易的剪辑工具。很多小伙伴都在使用。近期软件更是为了让大家方便剪辑推出了图文成片功能。想知道怎么使用吗?那就千万不要错过本期内容哦~ 剪映新功能图文成片介绍 通过该功能。用户们只要输入一段文字。软件就能智能为大家匹配图片素材、添加字幕、…

剪映AI图文成片快速剪辑

NO.1点击图文成片 剪映AI,你可以拿头条和悟空问答的文章链接过来,它就能识别文字,生成视频。当然你也可以自创文案,然后生成视频,字幕都给你加好了。AI的剪辑点还是舒服的,自己只需要替换素材。

iTab浏览器插件安装教程

iTab浏览器插件 iTab是一个好看好用的自定义卡片式浏览器新标签页扩展。 安装iTab标签页扩展后,您将告别呆板无趣的原生标签页,享受iTab标签页为您带来的个性化新体验: 离线资源下载: iTab资源 安装教程 IE 浏览器 1.打开浏览器 点击 右上…

朋友四面阿里Java岗的详细流程和面试问题。

最近一个朋友跟我说,现在面试太难了,再也不是以前那种随便背几个面试题然后就能拿到offer的时候了。最近准备换工作面试了阿里,和我交流了下他遇到的一些面试题,然后我整理了一下,就分享给有需要的朋友们顺便也查漏补缺…

腾讯,百度,阿里的面试经验

小白看了此同仁的面试经久久不能平复,感叹自己菜鸟的同时,痛恶自己对于时间的浪费,大学时期的小白真的很潇洒,工作到现在的小白也是偷得浮生半日闲的小潇洒,想练就下面的同仁的水平,小白不吃不喝还需要2年&…

参加春招的小tips!字节/腾讯/华为/美团/shopee/阿里 服务端开发面经

前言 写在最前面:目前接了字节的offer,校招想来字节的可以私信我 以下面经均是以时间线排列,最好每次面试完都自我总结一下 有些问题比较少的或者没列出来的基本都是在聊项目 腾讯一面(未知部门) mysql varchar和charchar是固定长&#x…

【阿里三面】好险!本以为是场普通的阿里面试,没想到二面就迎来了P9大佬

前言 阿里,我是在BOSS上投的简历,之前也投过一次,简历都没通过筛选,后来让前辈帮我改了一下简历,重新投另一个部门,获得了面试机会。5月15日,中午HR打电话过来预约了下午4点半面试,…

听GPT 讲K8s源代码--pkg(四)

/pkg/controlplane、/pkg/credentialprovider、/pkg/kubeapiserver是Kubernetes中的三个核心包,它们分别实现了不同的功能。 /pkg/controlplane包 /pkg/controlplane是Kubernetes的一个包,它包含了控制平面组件的实现,例如API Server、Contro…

系统安全实验(伪造IP,输出重定向获取flag)

1.伪造ip https://blog.csdn.net/wu_tongtong/article/details/124630153学姐赛高 题目描述 这道题目主要考查的是如何伪造HTTP请求头中的IP信息,这里我们推荐使用firefox自带的simple-modify-headers插件来伪造IP;当然你也可以选择使用其他工具来伪造HTTP请求头中的…

制作游戏辅助/外挂违法吗?

不知道你们有没有过一个体验: 玩《绝地求生》的时候,我们辛辛苦苦开着车在跑毒,旁边“咻”的一下突然蹭上来一个人,徒步跑得竟然比车快? 然后吧他还跑到你旁边开麦问:“嘿!兄弟!挂…

【直播预告】我写的代码犯法吗?公益的 IT 人法律科普在线直播活动来袭!

我写的代码犯法吗?公益的 IT 人法律科普在线直播活动来袭! image-20201212183656959 虽然我们这些 it 搬砖人只是敲敲键盘,搬点砖,但是很有可能你吃完泡面后开开心心地在 4K 显示器面前敲着新买的机械键盘时,警察叔叔就…

用假名印名片犯法吗_用简单的javascript学习假名

用假名印名片犯法吗 Learn Hiragana and Katakana charaters with some help from plain old JavaScript. 在普通的旧JavaScript的帮助下学习平假名和片假名角色。 We are making a single html page that will display a random Kana — a random Hiragana and its Katakana …

nft在国内到底合法吗

大家都比较关注这个问题接下来我就跟大家一起聊一聊 国内允许对虚拟硬币的投机和交易以及采矿进行打击,但也鼓励和支持区块链技术的发展,包括不涉及虚拟硬币投机的NFT。 对大多数人来说,NFT这个词让每个人既陌生又有些熟悉。陌生感是因为日常…

Python版实现12306抢票功能,真的能帮你抢到春运回家的票吗?

背景 每逢佳节倍思亲,年关将近,思乡的情绪是不是愈发强烈了,筒子们是不是又要准备开始抢票了,还是在找黄牛吗?但是,今年在考虑是否能抢到票以外,还需要考虑是否能回得去,没错&#…

python爬虫音乐犯法么_Python爬虫实战之爬取QQ音乐数据!QQ音乐限制太多了

def open_url(url): pass def find_attribute(url): pass def main: pass 复制网页链接 复制网页链接将链接用列表进行保存下来。如果想要同一时间获取多个网页里面的数据,自行书写for循环遍历列表即可。以下只以一个网页进行讲解。 def main: # 用列表进行存储网页链接 url =…

Python爬虫 | 写在系列博客的第一篇,爬虫到底犯法吗?看完再开始爬虫!!!

一、 什么样的爬虫是非法的? 爬虫不能涉及个人隐私! 如果爬虫程序采集到公民的姓名、身份证件号码、通信通讯联系方式、住址、账号密码、财产状况、行踪轨迹等个人信息,并将之用于非法途径的,则肯定构成非法获取公民个人信息的违…

学习ChatGPT,AI绘画引入人类反馈会怎样?

来源:机器之心 本文约2400字,建议阅读5分钟本文介绍了研究人员在文本到图像模型中引入人类反馈。 NLP 领域使用的技术不断地向其他领域扩展,如 CV 和多模态,鸿沟正在被打破。本文中谷歌研究院和加州伯克利的研究人员在文本到图像模…

(十三)AI作画、AI绘画、AIGC本地大模型

(十三)AI作画、AI绘画、AIGC本地大模型 AI作画近期很火,涌现出了很多AIGC(AI内容生成)的网站、平台,但这些平台都是使用的云上的算力,基本都有使用的各种限制等。 一、本代码自动将大模型下载本地,可以无-限-使-用。但是对硬件的…

健身房会员管理系统

开发工具(eclipse/idea/vscode等):idea 数据库(sqlite/mysql/sqlserver等):mysql 功能模块(请用文字描述,至少200字):涉及到的技术 SpringBoot Mybatis Thymeleaf mysql题目描述:健身房管理系统是对健身房会员,员工的管…