前言

最近在项目中需要在某个多行英文文本末尾增加一个图片,尝试了很多方法,最后用了一个比较Tricky的方法解决了,当然这种方法不一定是最好最优的解决办法,记录一下。

问题

如果直接使用drawableRight或者drawableEnd来将图片放置到文本末尾,结果会是这样:

图片会在TextView右边竖直方向的中间位置显示,而不是我们期望的在最后一行位置显示。

这时我们可以尝试使用ImageSpan来将图片放置在最后一行:

final TextView text = findViewById(R.id.text);

final String string = "dkffkdjkfjdkfjkdjfdjfkjdkfjkdjkdjfkjdkjk";

//创建一个SpannableString对象,后面增加空格是预留给图片的

SpannableString spannableString = new SpannableString(string + " ");

//创建图片的Drawable对象

Drawable drawable = getResources().getDrawable(R.mipmap.copy);

drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

//创建图片的ImageSpan对象

ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);

//设置ImageSpan,将其位置设置在spannableString最后面,起始位置start=spannableString.length() - 1,结束位置为end=spannableString.length(),

// SPAN_INCLUSIVE_EXCLUSIVE表示包含start不包含end

spannableString.setSpan(imageSpan, spannableString.length() - 1, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

text.setText(spannableString);

效果如下:

图片确实是放在了最后面,但是英文文本的显示出现了凌乱。

原因

实际上最后的效果是TextView绘制出来的,原因当然是TextView绘制咯。TextView的Span绘制主要是使用DynamicLayout里面的方法来计算行数,

调用其draw方法(DynamicLayout父类Layout实现)完成绘制。具体实现细节这里就不在阐述,有兴趣的朋友可以自行研究下。

解决

这里使用了比较讨巧的一种方式,问题主要是文本换行并没有按照我们期望的样子进行,而是换行之后后面还留了一大半空白。后面发现如果字符串中包含了空格的话,就会自动以空格的位置进行换行。所以解决思路就是按照TextView的宽度,计算每一行能够容纳的字符个数,在每一行的最后插入一个空格,就能解决换行凌乱了。

具体实现如下:

//先设置原始文本

text.setText(string);

//使用post方法,在TextView完成绘制流程后在消息队列中被调用

text.post(new Runnable() {

@Override

public void run() {

//获取第一行的宽度

float lineWidth = text.getLayout().getLineWidth(0);

//获取第一行最后一个字符的下标

int lineEnd = text.getLayout().getLineEnd(0);

//计算每个字符占的宽度

float widthPerChar = lineWidth / (lineEnd + 1);

//计算TextView一行能够放下多少个字符

int numberPerLine = (int) Math.floor(text.getWidth() / widthPerChar);

//在原始字符串中插入一个空格,插入的位置为numberPerLine - 1

StringBuilder stringBuilder = new StringBuilder(string).insert(numberPerLine - 1, " ");

//SpannableString的构建

SpannableString spannableString = new SpannableString(stringBuilder.toString() + " ");

Drawable drawable = getResources().getDrawable(R.mipmap.copy);

drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);

spannableString.setSpan(imageSpan, spannableString.length() - 1, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

text.setText(spannableString);

}

});

这里使用的是post方法延后处理,当然也可以使用ViewTreeObserver监听布局完成再进行处理,最后的效果,完美:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

android文本自动添加图片格式,Android中多行文本末尾添加图片排版问题的解决方法...相关推荐

  1. Android中多行文本末尾添加图片 图标在文字后面 换行

    效果 方式一:自己写文本及背景 val sb1 = SpannableString("好好学习好好学习好好学习好好学习好好学习好好学习好好学习好好学习好好学习好好学习好好学习好好学习好好学习 ...

  2. Android文本保存成PDF格式

    支持Android文本保存成PDF格式,Canvas画图保存JPG格式导出PDF格式,使用itextpdf-5.5.1.jar包 项目地址:http://download.csdn.net/downl ...

  3. Java实现一行代码生成二维码,可传输到前端展示,可自定义二维码样式,可设置图片格式,可对二维码添加图片,可对二维码添加文字,可以设置二维码大小、字体大小、字体颜色、边框颜色、边框大小等等

    Java实现一行代码生成二维码,可传输到前端展示,可自定义二维码样式,可设置图片格式,可对二维码添加图片,可对二维码添加文字,可以设置二维码大小.字体大小.字体颜色.边框颜色.边框大小等等. 0.准备 ...

  4. android线程改变布局,Android线程中设置控件的值提示报错的解决方法

    本文实例讲述了Android线程中设置控件的值提示报错的解决方法.分享给大家供大家参考,具体如下: 在Android线程中设置控件的值一般会与Handler联合使用,如下: package com.y ...

  5. 图片在canvas中显示,给canvas添加文字,文字描边,将canvas保存成图片下载到本地

    Canvas简介 HTML5新增标签 Canvas API(画布)是在HTML5中新增的标签用于在网页实时生成图像,并且可以操作图像内容,基本上它是一个可以用JavaScript操作的位图(bitma ...

  6. System.ArgumentException: 已添加项。字典中的关键字:“RegEx”所添加的关键字:“RegEx” 异常的解决办法...

    详细的错误信息: 已添加项.字典中的关键字:"RegEx"所添加的关键字:"RegEx" 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信 ...

  7. php iconv 空格,PHP_PHP中iconv函数转码时截断字符问题的解决方法,iconv是转换编码的,但是在中 - phpStudy...

    PHP中iconv函数转码时截断字符问题的解决方法 iconv是转换编码的,但是在中文转码时候出现显示不全问题. iconv("UTF-8","GB2312//IGNOR ...

  8. JSP中get和post请求方式的区别及乱码解决方法

    JSP中get和post请求方式的区别及乱码解决方法 get提交方式:默认method="get" 和 地址栏.超链接请求方式默认都属于get提交方式 form表单的method属 ...

  9. Word文档格式混乱出错等排版问题的解决方法

    编辑文档的时候,很多同学都苦恼于格式混乱.出错.文字过胖或过瘦等问题.这里,小编就教各位几招,学会后就基本可以对付文档啦.(PS:小编使用的是WORD2013,不过各个版本之间的布局一致,不用担心不适 ...

最新文章

  1. Meta旨在打造世界上最快的人工智能超级计算机
  2. 学习前端你必须看过这几本书!
  3. SQL Server数据库大型应用解决方案总结(转载)
  4. ordereddict有序字典
  5. python生成和导入pyc文件
  6. 【最佳实践】OSS开源工具ossutil-大文件断点续传
  7. ping html 微信支付,说说PING++介入微信H5支付,我趟过的坑。
  8. openresty模板html页面,单页面部署去Html缓存 nginx/openresty
  9. .net框架笔记(四)
  10. Java 在匿名内部函数中为外部函数变量赋值的解决方案
  11. 页面回到顶部的几种方法
  12. 领域驱动设计实现之路
  13. 短信验证码接收app必须注意的那些事
  14. 美股,期货和国债随着大选进行中持续大幅度波动,华尔街如何看待这次结局?
  15. ASP.NET 安全认证(二)【转】
  16. VC++利用微软msxml3.dll创建xml文件
  17. vue element 父传子,第一次传不过去
  18. int8 和 uint8 区别
  19. 欢迎Fork我们的开源云手机项目--OPENVMI(Virtual Mobile Infrastructure)(VMI)
  20. 数据库基本操作-----数据库用户管理和授权

热门文章

  1. OSI第六层:表示层功能作用
  2. ospf路由协议中,DR和BDR是什么意思?
  3. 资源|深度学习注意力机制TensorFlow 使用教程
  4. 图像超分辨率网络:RCAN
  5. 为IP签发SSL证书
  6. AI犯错谁之过?切勿盲目相信之
  7. java自动装箱性能
  8. 从电视到网络,vivo营销之变
  9. Linux常用指令---find | locate(查找)
  10. Office OpenXML-Excel(一)