将文本围绕 ImageSpan 中心垂直对齐

2023-11-30

我有一个ImageSpan一段文字里面。我注意到周围的文本总是绘制在文本行的底部——更准确地说,文本行的大小随着图像的增长而增长,但文本的基线不会向上移动。当图像明显大于文本大小时,效果就相当难看。

Here is a sample, the outline shows bounds of the TextView: enter image description here

我试图让周围的文本相对于所显示的图像垂直居中。这是相同的示例,蓝色文本显示所需的位置:

enter image description here

以下是我受到的约束:

  • 我无法使用复合绘图。图像必须能够在文字之间显示。
  • 根据内容,文本可能是多行的。我对此无法控制。
  • 我的图像比周围的文本大,我无法缩小它们的大小。虽然上面的示例图像比实际图像大(以演示当前行为),但实际图像仍然足够大,因此这个问题很明显。

我尝试过使用android:gravity="center_vertical"TextView 上的属性,但这没有任何效果。我相信这只是垂直居中文本lines,但在文本行内,文本仍然绘制在底部。

我当前的思路是创建一个自定义跨度,根据行高和当前文本大小来移动文本的基线。这个跨度将包含整个文本,我必须计算与ImageSpan这样我也可以避免移动图像。这听起来相当令人畏惧,我希望有人能提出另一种方法。

感谢任何和所有的帮助!


我的答案调整了第一个答案。其实上面两种方法我都试过了,我不认为它们是真正的中心垂直。如果将可绘制对象放置在两者之间,它将使可绘制对象更加居中ascent and descent, 而不是top and bottom。对于第二个答案,它将可绘制对象的中心与文本的基线对齐,而不是该文本的中心。这是我的解决方案:

public class CenteredImageSpan extends ImageSpan {
  private WeakReference<Drawable> mDrawableRef;

  public CenteredImageSpan(Context context, final int drawableRes) {
    super(context, drawableRes);
  }

  @Override
  public int getSize(Paint paint, CharSequence text,
                     int start, int end,
                     Paint.FontMetricsInt fm) {
    Drawable d = getCachedDrawable();
    Rect rect = d.getBounds();

    if (fm != null) {
      Paint.FontMetricsInt pfm = paint.getFontMetricsInt();
      // keep it the same as paint's fm
      fm.ascent = pfm.ascent;
      fm.descent = pfm.descent;
      fm.top = pfm.top;
      fm.bottom = pfm.bottom;
    }

    return rect.right;
  }

  @Override
  public void draw(@NonNull Canvas canvas, CharSequence text,
                   int start, int end, float x,
                   int top, int y, int bottom, @NonNull Paint paint) {
    Drawable b = getCachedDrawable();
    canvas.save();

    int drawableHeight = b.getIntrinsicHeight();
    int fontAscent = paint.getFontMetricsInt().ascent;
    int fontDescent = paint.getFontMetricsInt().descent;
    int transY = bottom - b.getBounds().bottom +  // align bottom to bottom
        (drawableHeight - fontDescent + fontAscent) / 2;  // align center to center

    canvas.translate(x, transY);
    b.draw(canvas);
    canvas.restore();
  }

  // Redefined locally because it is a private member from DynamicDrawableSpan
  private Drawable getCachedDrawable() {
    WeakReference<Drawable> wr = mDrawableRef;
    Drawable d = null;

    if (wr != null)
      d = wr.get();

    if (d == null) {
      d = getDrawable();
      mDrawableRef = new WeakReference<>(d);
    }

    return d;
  }
}

我也重写一下getSize保持drawable的FontMetrics与其他文本相同,否则父视图将无法正确包装内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将文本围绕 ImageSpan 中心垂直对齐 的相关文章

  • 未捕获的 ReferenceError: myFunction 未在 null:1 处定义 Web 视图中的 Android 异常

    我正在从活动中调用 javascript 函数 但我得到了Uncaught ReferenceError myFunction is not defined at null 1错误 这是我的文件 MainActivity java pack
  • 使用 android 将图像上传到 Flickr

    我需要将 Flickr 与 android 集成 我已完成身份验证 我需要将图像上传到 flickr 但我不知道如何执行相同操作 我参考文件 http www flickr com services api upload api html
  • 如何在flutter android插件包中处理android生命周期

    我需要知道 android 插件包中 flutter 应用程序视图的当前状态 现在 我观察颤振视图中的状态https docs flutter io flutter widgets WidgetsBindingObserver class
  • Gradle 构建过程失败

    我的项目正在成功构建 突然我在 Android studio 中收到以下错误 无法找到方法 org gradle api publish maven internal publication MavenPublicationInternal
  • MyGestureDetector 扩展了 SimpleOnGestureListener

    我正在实现一个扩展 SimpleOnGestureListener 的 MyGestureDetector 我从以下机构借了课程 http www codeshogun com blog tag view flipper http www
  • Android Studio 与 Google Play 服务的编译问题

    我正在运行 Android Studio 0 8 4 并在 Android Studio 0 8 2 上尝试过此操作 我正在运行 Java JDK 1 8 0 11 并尝试使用 JDK 1 8 0 05 每当我尝试构建我的 android
  • Ionic 4:硬件后退按钮重新加载应用程序

    从事项目并陷入问题 硬件后退按钮重新加载应用程序 我在此应用程序中使用 Angular Router 我退出应用程序的代码 ionViewDidEnter this subscription this platform backButton
  • 使用audioSessionId值实例化AudioFx类?

    我已经阅读了 Android API 并尝试在互联网上搜索有关声明自定义audioSessionId然后用它audioSessionId初始化 AudioFx 类并为我的 MediaPlayer 或 AudioTrack 分配硬编码audi
  • 如何以编程方式关闭画中画

    我在使用画中画模式时遇到了这个问题 当从 PIP 本身以外的其他位置再次打开 Activity 时 我想关闭 PIP 画中画 不是来自关闭按钮 我想要与 youtube 相同的场景 即当用户单击 PIP 画中画 时 它会打开相同的活动 但是
  • 如何切换状态栏?

    我正在寻找一种显示和隐藏状态栏的方法onClickListener 但仅显示其有效 WindowManager LayoutParams lp getWindow getAttributes if isStatusbarVisible lp
  • Horizo​​ntalScrollView 将 GridView 缩小为小行

    当我将 Horizo ntalScrollView 放在 GridView 周围时 GridView 会被压缩到左侧的一个小列中 Gridview 的垂直滚动条甚至出现在左侧 Horizo ntalScrollView 的宽度设置为 fil
  • 如何在我的谷歌上嵌入转弯导航

    我想在我的 Android 应用程序中嵌入逐段导航 请给我一个教程或如何执行此操作的想法 提前致谢 如果您不固定使用谷歌地图 您可以使用基于 OpenStreetMap 地图的维基百科版本 的 SDK 有几个不错的 SDK 提供商 skob
  • 无法读取第 0 行,第 -1 列

    我正在尝试复制使用 SQLite 管理器创建的数据库 我在其中执行了以下操作 CREATE TABLE android metadata locale TEXT DEFAULT en US and INSERT INTO android m
  • java.exe 以非零退出值 1 结束

    只是为了开始 我并不是真正尝试从 Android 中的 xlsx 文件中读取单元格 我已经尝试了几乎所有我在 Google 上搜索到的内容 但是每次 在两台不同的 PC 上 都是 Java 1 7 0 79 当我尝试构建 运行 这个应用程序
  • 从字符串中删除重音符号

    Android 中有没有什么方法 据我所知 没有 java text Normalizer 可以从字符串中删除任何重音 例如 变成 eau 如果可能的话 我想避免解析字符串来检查每个字符 java text NormalizerAndroi
  • React Native v0.71.8 React-native-vector-icons 你看不到的图标

    我在用react native版本v0 71 8 我安装了react native vector icons库 但图标未显示 似乎链接在最新版本的 React Native 中不再起作用 所以我按照说明进行操作 但它不再编译 出现以下错误
  • Meteor:即使设置了 ANDROID_HOME 也未设置

    操作系统 Ubuntu 14 04 框架 流星1 1 0 2 应用名称 Songofy 这是输出meteor install sdk android meteor install sdk android Found Android bund
  • Android 模拟器提示和技巧 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用Gradle组装时如何更改Android应用程序包名称?

    是否可以使用 Gradle 更改 Android 应用程序的包名称 我需要编译同一应用程序的两个副本 并具有唯一的包名称 这样我就可以向市场发布两次 作为使用的更简单的替代方案产品口味 正如伊森的回答 https stackoverflow
  • 无法 ACTION_VIEW 外部存储上的文件

    我的 Android 手机的外部存储中有一个文件 在本例中是模拟的 知道通往它的路径和 或拥有File代表它的对象 我如何使用Intent在适当的应用程序中打开它 我尝试的第一件事是 startActivity new Intent Int

随机推荐

  • 查找最大值并显示 MS Access 中不同字段的相应值

    所以我在 查找最大值并显示 SQL Server 中不同字段的相应值 但我想更进一步 我想获取每个 ID 和相应类型的最新日期 而不仅仅是所有条目的绝对最大值 有什么建议么 ID Type Date 1 Initial 1 5 15 1 P
  • 对于没有托管库存的 WooCommerce 变体显示“有库存”通知

    我需要针对特定 情况的帮助 在 WooCommerce 中 如果为简单产品或变体启用了 管理库存 则会在产品页面 gt 中显示通知 例如 此示例 1 但是 如果不启用 管理库存 那么就没有通知 我觉得很遗憾 因为即使我不管理库存数量 我仍然
  • Rstudio 闪亮可折叠侧面板

    我想最大化可用屏幕宽度mainPanel一个 Rstudio 闪亮的网页 在我的网页中 sidePanel用于选择参数以可视化结果mainPanel 我想知道如何才能最大限度地利用可用空间mainPanel 例如 我想要一个 折叠 展开 选
  • 为什么在 WebKit 上使用 :before height 时对齐标记列表不同?

    Code http jsbin com maropaxivo 1 edit html css 输出 请参阅 Firefox 和 Chrome 浏览器的示例代码 为什么对齐标记列表不同 li before height 20px conten
  • Toolstrip WinForms .Net Core 的问题

    我正在 Net Core 中制作一个 Winforms 应用程序来学习一些基本的东西 这是一个简单的应用程序 我将一些文本从文本框写入文件 基本上像记事本 现在我想添加一个带有工具条按钮的工具条来创建新文件和一个工具条按钮来将文本保存到文件
  • 在 Java 中使用 switch 的问题

    我不明白为什么它总是返回 arg1 的值 我正在建造一个重量转换器 public double convert double arg1 int arg2 int arg3 arg1 amount arg2 from arg3 to doub
  • signalR 中的第一个任意消息没有 messageID?

    我写了这个简单的代码 当连接时 应该产生 第一的 欢迎 3 条消息 计时器 这是代码 int i 0 protected override Task OnConnected IRequest request string connectio
  • 示例 Blazor 项目中的计数器状态可以在页面切换之间保留吗?

    在服务器端 Blazor 和 WebAssembly Blazor 项目的默认示例项目中 每次在页面之间移动时 计数器示例都会重置为 0 但是 在 ASP NET React 示例项目中 计数器不会在页面切换之间重置 有没有办法让像 Cou
  • 如何使用 kotlin 协程进行 Firestore 查询

    我创建了一个应用程序Kotlin and Firebase Firestore 现在我需要实现协程 因为主线程上有很多工作 但我也是一个初学者 所以这对我来说是新的东西 我看过一些关于此的教程 但没有找到完整的教程Firestore与协程
  • 隐藏多个div,默认显示1,并根据链接点击在它们之间切换(显示/隐藏)?

    我知道显示 隐藏的事情已经在堆栈上被覆盖得很厉害 但我只是找不到适合我的解决方案 抱歉 我已经尝试了几种我发现的 JS jQuery 解决方案 但无法完全让其中一个按照我想要的方式运行 我有许多内容非常相似的 div 内容根据所选版本略有变
  • Android GCM 服务器已发送但 GCM 未推送到设备

    我正在手机上测试 GCM 2 3 6 安卓 清单文件 MainActivity First 和 Second 活动不执行任何操作 它们用于其他测试目的 不会干扰 GCM
  • 无法使用 Netlify 和 Heroku 跨域设置/接收 cookie

    我遇到了无法在浏览器中设置 cookie 的问题 因为客户端托管在 Netlify 上 服务器托管在 Heroku 上 它在本地主机上运行良好 所以看起来它现在与跨域有关 阅读了多篇关于此的文章后 似乎这可能与 cors 或我如何设置 co
  • 矩阵的某些值没有出现在 Matplotlib 的图中

    我从 CSV 创建了一个空参考矩阵 将 x y 定位为矩阵上的一个位置 并将其打印出来 并将 100 指定为矩阵上的该位置 每个 x 都是 ref mass pandas 系列中的值 ref df pd read csv ref file
  • 更改 JTable 中单元格的颜色

    我想更改 JTable 中单元格的颜色 我编写了自己的类来扩展 DefaultTableCellRenderer 然而 我的班级确实有不一致的行为 它所做的只是 如果某个条目在一列中出现两次 则会将其标记为红色 这是我得到的结果 请注意 在
  • IIS 6/7 是否会在提供图像文件时锁定图像文件?

    我正在编写一段 NET 代码 需要覆盖 IIS 6 或 7 上托管的网站中的图像文件 唯一应该接触图像的进程是 IIS 和我覆盖图像的进程 我想知道 IIS 是否会锁定文件 导致我的覆盖代码抛出异常 简短的答案是尝试打开文件 如果失败 请等
  • Rotativa Pdf 生成不考虑 HTML 字符间距

    我正在使用 Rotativa 将 MVC HTML 转换为 Pdf 在 HTML 中 一切看起来都很好 但在 Pdf 格式中 字符间距的格式不太好 因为它太小了 这大大降低了文档的可读性 下图中是 HTML 中的字符串 这是使用 Rotat
  • EC2 密钥对更改

    我看到了几个有关更改正在运行的实例的 EC2 密钥对的问题和答案 然而 我现在是一个完全的 AWS 新手 我可以轻松停止正在运行的实例并重新启动它 在我们的情况下这不是问题 是否可以停止正在运行的 EC2 实例并以某种方式更改密钥对 然后在
  • 如何在Javascript中检查点是否在多边形中

    我遇到了这段 C 代码 我认为 这应该是检查一个点是否在concave or convex多边形 我想将其转换为 JS 等效函数以在我的 JS 程序中使用 int pnpoly int nvert float vertx float ver
  • 处理 Promise 内错误的正确方法

    目前 我正在尝试决定在处理 Promise 内的错误时应该使用哪种模式 例如 我有下面的代码 promiseFunc then result gt console info THEN result catch error gt consol
  • 将文本围绕 ImageSpan 中心垂直对齐

    我有一个ImageSpan一段文字里面 我注意到周围的文本总是绘制在文本行的底部 更准确地说 文本行的大小随着图像的增长而增长 但文本的基线不会向上移动 当图像明显大于文本大小时 效果就相当难看 Here is a sample the o