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}
}

Android 实现图文混排相关推荐

  1. android多媒体图文混排,干货!!!Android富文本实现图文混排

    效果图 rich.jpg 像图中的效果,大家在开发并不少见,大家可能不知道android提供了实现图文混排的类.大家或许会写一个布局或者使用drawableLeft这个属性实现文本的左侧图标. and ...

  2. android多媒体图文混排,android图文混排

    背景 最近我们的产品来了个新的模块,给学生做题提高成绩的.需求如下: 支持单选.多选.填空题 支持图片文字混排 输入框有交互,排版精致美观 为了体验优化,不能使用网页实现效果 思路分析 我们的图文混排 ...

  3. Android 动态图文混排的常用方法

    2019独角兽企业重金招聘Python工程师标准>>> DrawableIcon的设置 对于TextView或者EditText动态设置drawableLeft,drawableRi ...

  4. Android动态图文混排,Android控件TextView实现静态图与动态GIF图文混排

    最近做项目功能时,需要在TextView中展示图文,刚开始做的时候以为很简单,只需要用个ImageView跟TextView来展示就行了,可是发现这样做,不能实现我们需要的效果,这就需要涉及到富文本T ...

  5. android 之图文混排+GridView

    实例代码: package com.hsj.example.gridviewdemo01;import android.app.ProgressDialog; import android.graph ...

  6. [Android]listview图文混排

    一.效果图: 二.代码实现 2.1ListViewActivity package cn.ac.ucas.yp.uiwidgettest;import android.support.v7.app.A ...

  7. Android TextView中图文混排设置行间距导致高度不一致问题解决

    Android TextView中图文混排设置行间距导致高度不一致问题解决 参考文章: (1)Android TextView中图文混排设置行间距导致高度不一致问题解决 (2)https://www. ...

  8. android 点击图片事件,android图文混排点击事件

    图文混排顾名思义就是把文字和图片混合排列在一起,比较简单的需求我们也可以通过TextView和ImageView配合使用来达到目的,但是遇到稍微复杂一些的情况这种方法就不适用了. 做这样一个按钮: 对 ...

  9. Android中实现不同文字颜色和图文混排的Span总结

    一.怎么在TextView中设置首行缩进两个字符 在string资源文件中,在文字的前面加入"\u3000\u3000"即可实现首行缩进 在Java代码中,使用setText(&q ...

  10. Android 图文混排 通过webview实现并实现点击图片

    在一个开源项目看到是用的webview 实现的 1. 这是在asset中的一个模板html <html> <head> <title>News Detail< ...

最新文章

  1. (七十九)MapKit的基本使用
  2. 【云栖说第三期】发现大家对能模仿马云声音的ET有兴趣,我们找了阿里四位专家来聊聊ET背后的人工智能...
  3. dhcp 中继代理配置方法
  4. IPv6 RIPng (PT)
  5. mysql源码安装分析_MySQL源码分析(0):编译安装及调试(转)
  6. Linux仿真运算集群,fluent DPM Linux计算集群运行报错 - 计算模拟 - 小木虫 - 学术 科研 互动社区...
  7. 让这家有12万名员工、1.7万种产品的钢铁厂平滑上云的黑科技是什么?
  8. SuperSlidev2.1 轮播图片和无缝滚动
  9. linux 防火墙 iptables的简单使用
  10. elf section类型_探索ELF可执行文件的“干货”:段头表和段的基本介绍
  11. 人总有盲点,需要共同进步
  12. 雷赛服务器信号er020,雷赛配合松下电机做三轴,xy轴到位信号的问题
  13. 俄语入门-俄语语音规则
  14. 浅谈几个倾斜摄影三维模型的修补软件
  15. 思科实验-生成树协议STP
  16. actions vuex 请求_vue中vuex的actions里面请求接口,提交给mutations报错
  17. [Linux Audio Driver] Qualcomm平台音频GMS认证器件要求
  18. 昆石VOS3000/VOS2009 V2.1.7.01/V2.1.7.03 操作指南
  19. 脑电数据的实验范式及EEGLAB分析预处理
  20. 高精度数字高程数据1m的dem

热门文章

  1. netty报错LEAK: ByteBuf.release() was not called before it‘s garbage-collected.的解决方法
  2. 关于微信小程序的wx.request执行后sucess和fail的问题
  3. 《算法竞赛进阶指南》 防线
  4. 【RTD】铂电阻测温原理与具体方法
  5. c语言窗口画图,C语言实现画图程序
  6. 使用iTunes下载旧版本的IPA文件
  7. android平板投影到电视,平板投屏到电视机如何操作可以互投
  8. 本科计算机专业考研集成电路,集成电路工程专业考研院校排名
  9. HTML初心自学记录(四)列表超链接
  10. java+桌球小游戏图片_Java桌球小游戏