[Android]ImageSpan与TextView同一行图片居中

Android TextView中显示图片的4种方式 我们知道,TextView控件一般是用来显示文本的,而图片一般是用ImageView控件来显示。那TextView能否显示图片呢?答案是肯定的!下面列出常见的4种方式。 阅读详情

在开发中常常会遇到标签(图片)+文字的需求,实现方式一般采用SpannableString的方式来实现。 这时候会遇到图片ImageSpan没有办法居中的问题。在解决这个问题之前,先学习字体属性Paint.FontMetrics。
文字实际尺寸属性
文字实际位置属性
通过上面的示意图,再看下FontMetrics 类:

 public static class FontMetrics {
    /**
     * The maximum distance above the baseline for the tallest glyph in
     * the font at a given text size.
     */
    public float   top;//最高字符到baseline的值,即ascent的最大值
    /**
     * The recommended distance above the baseline for singled spaced text.
     */
    public float   ascent;//系统建议的,绘制单个字符时,baseline至字符最高处的距离
    /**
     * The recommended distance below the baseline for singled spaced text.
     */
    public float   descent;//系统建议的,绘制单个字符时,baseline至字符最低处的距离
    /**
     * The maximum distance below the baseline for the lowest glyph in
     * the font at a given text size.
     */
    public float   bottom;//最低字符到baseline的值
    /**
     * The recommended additional space to add between lines of text.
     */
    public float   leading;//上一行字符的descent到下一行字符ascent之间的距离,行间距
}
  • ascent线Y坐标 = baseline线的y坐标 + fontMetric.ascent;
  • descent线Y坐标 = baseline线的y坐标 + fontMetric.descent;
  • top线Y坐标 = baseline线的y坐标 + fontMetric.top;
  • bottom线Y坐标 = baseline线的y坐标 + fontMetric.bottom;

在ImageSpan的构造函数中有一个对齐方式的参数,但只提供了

ALIGN_BASELINE(顶部对齐)、ALIGN_BOTTOM (底部对齐)

两种对齐方式,没有居中对齐的方式, 所以只能重写ImageSpan实现图片的居中。

public void draw(Canvas canvas, CharSequence text,int start, int end,
float x, int top, int y, int bottom, Paint paint)

参数解析:

  1. x:要绘制的image的左边框到textview左边框的距离。
  2. y:替换文字的基线坐标。
  3. top:替换改行文字的最顶部位置。
  4. bottom:替换改行文字的最底部位置,行间距属于上一行,因而bottom是行间距的底部位置。

然后重写draw()方法即可实现图片居中,实现方式如下:

 @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();
    Paint.FontMetricsInt fontMetricsInt = paint.getFontMetricsInt();
    int transY = (y + fontMetricsInt.descent + y + fontMetricsInt.ascent) / 2 - drawable.getBounds().bottom/2;
    canvas.save();
    canvas.translate(x,transY);
    drawable.draw(canvas);
    canvas.restore();
}
  1. y +fontMetricsInt.descent得到字体的descent线坐标
  2. y + fontMetricsInt.ascent得到字体的ascent线坐标
  3. 两者相加除以2,得到该行文字的中线坐标
  4. drawable.getBounds().bottom/2得到图片中线坐标
  5. 然后两者相减,即可获得图片需要移动多长的距离可以居中
  6. 最后将相减得到的距离传给canvas.translate(x,transY)即可
Android TextView 富文本之 ImageSpan 前言 我们现在在 Android App 中几乎天天都能见到 ImageSpan,比如 App 自定义的 emoji 表情和文本中带的一些小图标等。 你可能要问了既然都有 emoji 了,为啥还要自定义呢,输入法里的 emoji 和 ImageSpan 的有啥不一样呢?。要做这玩意儿肯定还是产品提的需求啦,想自己原创一些比较 贱 的表情吧。现在好多输入法都自带的 emoji 只是一串字符,Te... 阅读详情

相关推荐

告别串口升级!手把手教你为STM32H750的W25Q32制作MDK下载算法(QSPI篇)

本文详细介绍了为STM32H750的W25Q32制作MDK下载算法(QSPI篇)的完整流程,帮助开发者告别低效的串口烧录方式。通过定制下载算法,可实现20倍以上的烧录速度提升,支持完整的调试功能,显著提高开发效率。文章涵盖环境准备、核心算法实现、性能优化及常见问题解决方案,适合嵌入式开发者参考。

weixin_30735745的博客 403

Android ImageSpan使TextView的图文居中对齐

TextView图文混排第反应肯定使用ImageSpan 居中对齐

后知后觉者! 9475

深入解析STM32定时器中央对齐模式3的双中断机制

本文深入解析了STM32定时器中央对齐模式3的双中断机制。该模式在一个PWM周期内,会在计数器到达ARR(上溢)和0(下溢)时各触发一次更新中断,实现更精细的实时控制。文章详细阐述了其工作原理、配置方法,并指导如何在中断服务函数中通过DIR位区分中断来源,同时探讨了其在电机控制、数字电源等场景下的应用优势与CPU负载挑战。

weixin_29164185的博客 493

Android 解决图文混排,图片和文字居中对齐问题(ImageSpan)

一. 概述众所周知,Android图文混排可以通过SpannableString来实现,通过在相应位置使用ImageSpan替换即可,但是使用过的人会发现,imageSpan只提供了两种对齐方式,如下所示: /** 底部对齐 */ public static final int ALIGN_BOTTOM = 0; /** 基线对齐 */

山中小僧的进阶之路 9429

LVGL仪表盘实战:5分钟用lv_meter打造汽车仪表UI(附完整代码)

本文详细介绍了如何使用LVGL的lv_meter组件在5分钟内构建专业汽车仪表盘UI。从环境配置、刻度定制到指针动画和性能优化,提供完整代码示例和实战技巧,帮助开发者快速实现嵌入式设备上的高效仪表盘设计。

k5l6m的博客 421

《小白入门:无人机电调 ESC 的 PWM 接口特性、主流协议与使用指南》

电调是无人机的 “动力中枢”,其 PWM 接口是入门的基础,而 SBUS、DroneCAN 等协议则代表了更高阶的控制方式。小白学习时,需先掌握 PWM 的基本特性和连接方法,再根据场景选择合适的协议,同时严格遵守使用注意事项(如电源匹配、校准步骤、安全操作)。随着实践深入,逐步理解 “协议差异” 和 “系统协同”,才能让无人机更稳定、安全地飞行。

bother3000的博客 3769

android在RelativeLayout里的TextView或者EditView里放置ImageView使其居中;靠右显示设置

代码这样就可以的: <RelativeLayout android:layout_width="100dp" android:layout_height="30dp" > <TextView ...

ShiXinXin_Harbour的博客 1496

论文阅读笔记:Extended Vision Transformer (ExViT) for Land Use and Land Cover Classification

注意力机制驱动的深度模型最近取得了成功,如最具代表性的视觉转换器(ViT),吸引了一波高级研究来探索它们对更广泛领域的适应。然而,遥感(RS)领域中基于Transformer的方法更关注单模态数据,这可能会在充分利用不断增长的多模态地球观测数据时失去可扩展性。为此,我们提出了一种新的多模式深度学习框架,通过在最小修改的情况下扩展传统的ViT,针对土地利用和土地覆盖(LULC)分类任务。

嗑研狗的日常 945

Android ImageSpan与TextView中的text居中对齐问题解决(无论TextView设置行距与否)

先解释一个类:Paint.FontMetrics,它表示绘制字体时的度量标准。google的官方api文档对它的字段说明如下: ascent: 字体最上端到基线的距离,为负值。 descent:字体最下端到基线的距离,为正值。 看下图: 中间那条线就是基线,基线到上面那条线的距离就是ascent,基线到下面那条线的距离就是descent。 回到主...

weixin_34080571的博客 557

从学生项目到工程实践:手把手教你用ATE测试电源芯片的Rdson与漏电流

本文详细介绍了如何将学术级的电源芯片测试方案转化为工业级解决方案,重点讲解使用ATE设备测试Rdson(导通电阻)和漏电流的关键技术。从设备选型、测试夹具设计到量产环境下的工程化实现,提供了实用的优化技巧和常见问题解决方案,帮助工程师提升测试效率和精度。

weixin_42525289的博客 180

C盘在同一时间突然多出100g的文件,请问是什么原因,以及是否能删除?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1758

android span图片居中,Android ImageSpan的图文居中对齐

ImageSpan类为TextView提供了图文混排的形式,在ImageSpan的构造函数中提供了一个参数int verticalAlignment,表示垂直对齐方式,有两个参数ALIGN_BASELINE、ALIGN_BOTTOM 分别为顶部、底部对齐,但是没有居中对齐的参数(其实会找到这篇文章的人应该知道这点了。。)下面说说我的实现思路及方法1.根据构造函数verticalAlignmen...

weixin_39760389的博客 1013

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

关于Android使用TextView+ImageSpan同一行文字图片居中的问题

项目开发中遇到了这样一个需求,标签(图片)和文字,标签显示在标题的开头,自然而然想到了用TextView+ImageSpan的方式来弄,开始没有思路,网上搜索一下基本上都有说到,但是都没有解决一个问题,就是居中。怎么设置都设置不了!后来找到一篇文章里面介绍了ImageSpan的getSize()方法设置了展示位置!下面给出自定义修改的ImageSpan,至于怎么用ImageSpan就不多说了 /

DJCKEN的专栏 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

TextView使用ImageSpan,多行显示末尾添加图片,并使图片居中

TextView使用ImageSpan显示图片 private void initText(TextView tv,String str) { SpannableString ss = new SpannableString(str + " "); int len1 = ss.length(); Drawable drawable = ContextCompat.getDrawable(this, R.drawable.task_sign);

weixin_44172660的博客 1451

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android图文混排ImageSpan居中,以及设置间距问题

test Android里面使用SpannableString或SpannableStringBuilder来拼接图片与文字,可以将其放到一个TextView控件里面来显示。使用ImageSpan来拼接图片,但是系统默认的ImageSpan能力非常弱,默认无法居中对齐,也无法设置图片与文字的间距,所以我们通常需要自定义ImageSpan,来解决上述问题。这里封装了一个工具类CenterSp...

h4x0r_007的专栏 6592

Android——ImageSpan图片和文字实现垂直居中

默认情况,图片是底部对齐,如下图: 这里先抛出一个问题,怎么获取TextView最终显示的高度??? 由于上面那个问题我还没有找到答案,所以本节暂时以两个情况来分析,如何实现图片文字垂直居中。 1、图片高度大于文字高度: 这时,我们不需要处理图片,只需要处理文字显示的位置即可,可以使用上一节(Android——SpannableString字体大小不一致垂直居中)中的VerticalAlig...

小欣儿的专栏 5806

Android TextView 富文本SpannableString 文字+图片居中显示,支持图片换行居中显示

Android TextView 富文本SpannableString 文字+图片居中显示 代码示意: 注意1. drawable 为图片资源,只能是一整张图,如酒店星级,5星级一张5个星星的图片,不能是1个星星循环5次拼接一起,因为涉及到图片换行显示。 2. textView先显示文本,后加空格" ",然后再拼接图片上去。 3. 需要根据字段映射不同的图片,如1-5星级,对应的不同的图片dra...

a day a better 5217

TextView图文混排——让图片居中跟在文字之后

项目中UI给提了个需求,这里用草图示意: 上图圆形是一个logo图片,UI想让logo永远紧跟标题居中显示,不然标题在多行时,logo单独居中特别丑。 看似简单的需求,着实难着了我,因为只要是使用TextView和ImageView,他们就是两个对象,没法相亲相爱在一起啊……直到某天编辑文档时突然想到,可以用TextView的图文排版功能啊!单独对字体进行处理,在字体后追加图就行了。 这...

披萨大叔的博客 1883

安卓TextView文本加图片混合显示

安卓TextView文本加图片混合显示 好久没写博客了,大家在项目中可能经常碰到文字开始或者末尾显示图标的情况,当单行显示的时候,我们可以使用drawableEnd等属性如下在设置: android:drawableEnd="@drawable/bg_corner_f6f8f9_5dp" 或者直接使...

君无意的博客 1265

Android TextView图文混排,图片和文字居中对齐

TextView用来显示文本是最普通的用法了,有些情况需要我们再文本中显示图片,比如显示表情,下边来说说处理方法.1.下图是项目中一个UI需求 如图需要在文本的前边显示新上标签,开始的处理方法是用了两个空间分别显示标签和文本,但是有个问题是第二行的文本不能顶头对齐,很不美观.我们可以通过图文混排来解决上述问题,通过SpannableString来实现,在相应位置使用ImageSpan替换即可,但是

ronaldong99的专栏 4025

FontMetrics以及自定义ImageSpan实现TextView中文图混排时文图的居中对齐

这个标题有点长,乍一看这么个标题你可能没明白啥意思,且听我慢慢道来。 公司的项目中新增了一个“心动” 的功能,用户初次使用时需要给一个引导页,就是下面图中的这个样子(这就是做完之后的效果了)。 Paste_Image.png 在上图中整体实现的时候使用的是popUpWindow。该popupWindow整体使用相对布局,里面再用一个相对布局布局嵌套了三个TextView:"啊哦。。。。pa...

CnPeng 666

java xml textview居中_android—图文垂直居中 TextView+SpannableString

自我感觉做什么事情都是事倍功半,同样性格还是丢三落四的人。记录每一次解决问题的思路经过,以供自我学最终效果前几天让做一个效果如上图,于是引发了一些列的思路风暴:(思路1)TextView+Html的形式:html在网页实现很常见的,所以不免第一个反应就是用html。于是让前端哥们写了一段html文本,但是当我用着个文本显示的时候发现没有效果,于是开始想是不是因为哥们用的CSS3.0,html5的原...

weixin_35999669的博客 449

Android TextView imageSpan 居中问题

textview imageSpan 图片居中问题

Shangri 2632
上一篇: Mac系统 安装 JDK 并配置环境
下一篇: [Android]自定义ReplacementSpan实现带背景色的圆角SPAN
runstoppable
博客等级 码龄10年 1粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值