android 字符串对齐,android – 使用Spanable String对齐ImageSpan

我知道有很多相同类型的问题可供使用,我尝试了很多解决方案,但所有这些问题都达不到我的要求.

我的问题是我必须在包含Spanable字符串和Imagespan的文本之间添加动态行间距,但是当我添加行间距时,文本和图像的对齐会变形.

我已经尝试了Stackoverflow上几乎所有可用的解决方案,如this,this& this但是一切都在静脉中.

我附上了截图

>添加动态行间距之前的屏幕截图

B3cb7.png

2.添加动态行间距后的屏幕截图

014284f033b84a3b54b609f673026238.png

任何帮助将受到高度赞赏.提前致谢!

解决方法:

在onDraw方法中使用“y”查找文本的基线,然后将drawable与文本视图的基线对齐

public class VerticalImageSpan extends ImageSpan {

public VerticalImageSpan(Drawable drawable) {

super(drawable);

}

/**

* update the text line height

*/

@Override

public int getSize(Paint paint, CharSequence text, int start, int end,

Paint.FontMetricsInt fontMetricsInt) {

Drawable drawable = getDrawable();

Rect rect = drawable.getBounds();

if (fontMetricsInt != null) {

Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt();

int fontHeight = fmPaint.descent - fmPaint.ascent;

int drHeight = rect.bottom - rect.top;

int centerY = fmPaint.ascent + fontHeight / 2;

fontMetricsInt.ascent = centerY - drHeight / 2;

fontMetricsInt.top = fontMetricsInt.ascent;

fontMetricsInt.bottom = centerY + drHeight / 2;

fontMetricsInt.descent = fontMetricsInt.bottom;

}

return rect.right;

}

/**

* see detail message in android.text.TextLine

*

* @param canvas the canvas, can be null if not rendering

* @param text the text to be draw

* @param start the text start position

* @param end the text end position

* @param x the edge of the replacement closest to the leading margin

* @param top the top of the line

* @param y the baseline

* @param bottom the bottom of the line

* @param paint the work paint

*/

@Override

public void draw(Canvas canvas, CharSequence text, int start, int end,

float x, int top, int y, int bottom, Paint paint) {

Drawable drawable = getDrawable();

canvas.save();

Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt();

int fontHeight = fmPaint.descent - fmPaint.ascent;

int centerY = y + fmPaint.descent - fontHeight / 2;

int transY = centerY - (drawable.getBounds().bottom - drawable.getBounds().top) / 2;

canvas.translate(x, transY);

drawable.draw(canvas);

canvas.restore();

}

}

标签:android,android-layout

来源: https://codeday.me/bug/20190701/1349634.html

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

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

相关文章

如何将JBoss HR员工奖励项目放入云端

我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 我们从头到尾讨论了各个层,但尚未为您提供除Red Hat Container Development Kit(CDK)之外的任何应用程序开发工具。 到目前为止,您所拥有…

用JIRA管理你的项目

https://blog.csdn.net/gaowenhui2008/article/details/70241657 (一) JIRA环境搭建 转载于:https://www.cnblogs.com/eustoma/p/9637509.html

ArcGIS编辑操作的常用快捷键一览表

在ArcMap中,快捷键与一些编辑工具和命令相关联。使用快捷键能使编辑工作更加快捷有效,总结如下: 一、公共快捷键(对所有编辑工具有效): Z:放大 X:缩小 C:漫游 V&#xff…

javaone_JavaOne 2012:使用HTML5和Java构建移动应用程序

javaone我返回了Parc 55 (任务会议室),观看Max Katz的( Exadel开发人员关系)“使用HTML5和Java构建移动应用程序” Bird-of-Feather(BoF)演示文稿。 具体来说,Katz在Tiggzi &#xf…

android recyclerview 横向item 宽度,RecyclerView的item宽度不能全屏显示及线性布局与grid布局切换混乱解决方法...

1.RecyclerView的Item宽度不能全屏显示出现这种的原因有两种:1.第一种是在adapter中加载inflater时parent传入为null2.如果第一种不行,第二种原因就是在RecyclerView外随意加一层布局即可充满解决方法,在onCreateViewHolder按照如下修改&…

剑指offer(一):二维数组中的查找

题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否…

sed以及awk的替换命令

转载自:http://blog.csdn.net/imzoer/article/details/8721590 先看sed 的。 比如说, 在上面使用sed替换每行第一个出现的nau为n_a_u。 如果加上g参数,那么对已一行,每次遇到一个nau就要替换一次。 -----------------------------…

图片下载中文传输转义问题

// 定义utf-8转义失败,中文是一串什么3E%什么的 URLEncoder.encode((productName".jpeg"), "UTF-8") // 改成如下代码 new String((productName ".jpeg").getBytes("utf-8"), "ISO8859-1") 转载于:https://www.…

NetBeans Java EE技巧8:持久性单元

任何好的IDE的基本目标都是简化和组织代码和开发工作流程。 NetBeans在实现这些目标方面做得非常出色,有时我们将基础知识视为理所当然。 例如,如果您曾经试图在纯文本编辑器中阅读XML蒙上了双眼,那么过去在配置和使用Persistence Units时可能…

c语言循环链表中设立尾链表,C语言实现双向非循环链表(带头结点尾结点)的节点插入...

对于双向链表,个人推荐使用带头结点尾结点的方式来处理会比较方便。我在《C语言实现双向非循环链表(不带头结点)的节点插入》中详细实现了在不带头结点的情况下的插入。这次我们将会来在使用头结点尾结点的情况下在任意的位置插入元素。代码上传至 https://github.c…

ls实现列文件按时间排序

转载自:http://blog.csdn.net/gtuu0123/article/details/4420424 1) ls -lt 时间最近的在前面 2) ls -ltr 时间从前到后 3) 利用sort ls -l | sort 7 (日期为第8列) 时间从前到后 ls -l | sort -r 7 时间最近的在前面

sqlserver添加默认值

知识点: sql添加字段默认值时:1.如果有加 not null ,则已有记录该字段值更新为默认值2.如果没有加 not null,则为null代码: IF EXISTS ( SELECT TOP 11FROM INFORMATION_SCHEMA.COLUMNSWHERE [TABLE_NAME] Produ…

android服务器 性能,Android性能优化(中)

Android性能优化在上一篇中介绍了性能优化的概念、内存泄漏和性能优化方式Android性能优化(上)我们继续说说Android性能优化数据库性能优化索引简单的说,索引就像书本的目录,目录可以快速找到所在页数,数据库中索引可以帮助快速找到数据&…

jvm系列二之GC收集器

目录 参考概念理解并发和并行吞吐量GC垃圾收集器Serial New收集器Parallel New(并行)收集器Parallel Scavenge(并行)收集器Serial Old(串行)收集器Parallel Old(并行)收集器CMS收集器…

shell脚本中一些特殊符号

在shell中常用的特殊符号罗列如下&#xff1a; # ; ;; . , / \\ string| ! $ ${} $? $$ $* \"string\"* ** ? : ^ $# $ command{} [] [[]] () (()) || && {xx,yy,zz,...}~ ~ ~- & \\<...\\> - % ! # 井号 (…

java 并发执行_Java并发执行器的懒惰开发人员简介

java 并发执行如果我告诉您util.concurrent API自2004年起提供此类服务&#xff0c;我就会自欺欺人。但是&#xff0c;我想回顾一下一些很酷的功能。 并发专家&#xff0c;现在是时候关闭该窗口了。 所有其他人&#xff0c;请保持紧紧的乐趣。 你不会忘记你的根源 执行程序是具…

球球大作战测试服android版,球球大作战10.0体验服

在球球大作战10.0体验服中&#xff0c;2019球球们将迎来全新的冒险&#xff0c;多重外观&#xff0c;更加的绚丽夺目&#xff0c;探索新的地图&#xff0c;与不同的对手较量一番&#xff0c;无限吞噬&#xff0c;热血竞技&#xff0c;灵活的走位&#xff0c;搭配强力道具&#…

单线程的并发,协程

IO多路复用 作用:检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据) setblocking(Flase) 让原本阻塞的变成非阻塞(不等待)状态 import socket import selectsk socket.socket() sk.setblocking(False) try:sk.connect(("www.baidu.com",80)) exce…

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

在做shell批处理程序时候&#xff0c;经常会涉及到字符串相关操作。有很多命令语句&#xff0c;如&#xff1a;awk,sed都可以做字符串各种操作。 其实shell内置一系列操作符号&#xff0c;可以达到类似效果&#xff0c;大家知道&#xff0c;使用内部操作符会省略启动外部程序等…

android.mk 模块编译,通过Android.mk添加一个编译模块到系统中的顺序如下

①LOCAL_PATH②CLEAR_VARS③LOCAL_SRC_FILES④LOCAL_CFLAGS(可选)⑤LOCAL_MODULE⑥LOCAL_STATIC_LIBRARIES(可选)⑦BUILD_XXX(12)Android.mk常用的变量变量名 说明LOCAL_PATH 用于确定源码所在的目录&#xff0c;最好把它放在CLEAR_VARS变量引用的前面&#xff0c;因为它不会被…