BackgroundColorSpan 调整高度或添加填充

2023-12-24

我有一个应用程序,可以在其中显示格式化文本的多行和多个段落TextView。我在用SpannableStringBuilder以此目的。

我在这里想做的一件事是能够突出显示文本。现在我尝试使用BackgroundColorSpan,但在这种情况下,文本上的背景覆盖了整个行高。我希望它只覆盖文本。似乎没有明显的方法可以在此跨度上设置垂直填充或高度。只是颜色。

其次,我也尝试过子类化ReplacementSpan并实施backgroundSpan我自己通过在此类的绘制方法中进行绘制来实现。但这似乎不支持多行突出显示。

谁能告诉我如何实现这个突出显示功能?基本上,我希望它像电子书阅读器一样工作,最好是Kindle或默认的图书阅读器Android.


我尝试了 koopuluri 的解决方案,但是当我只想突出显示某些单词时,LineBackgroundSpan 是针对整个段落的。所以我找到了ReplacementSpan,我们可以在其中重写该函数draw并在文本后面画一个矩形。您必须为其指定文本高度。

/**
 * It's like a {@link android.text.style.BackgroundColorSpan} but we don't paint the extra line height.
 * <p/>
 */
public class BackgroundColorWithoutLineHeightSpan extends ReplacementSpan
{
    private final int mColor;
    private final int mTextHeight;

    public BackgroundColorWithoutLineHeightSpan(int color, int textHeight)
    {
        mColor = color;
        mTextHeight = textHeight;
    }

    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm)
    {
        return Math.round(measureText(paint, text, start, end));
    }

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint)
    {
        int paintColor = paint.getColor();
        RectF rect = new RectF(x, top, x + measureText(paint, text, start, end), top + mTextHeight);
        paint.setColor(mColor);
        canvas.drawRect(rect, paint);
        paint.setColor(paintColor);
        canvas.drawText(text, start, end, x, y, paint);
    }

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

BackgroundColorSpan 调整高度或添加填充 的相关文章

  • Android - 保存动态更改布局的状态

    我有一个布局 用户可以在其中添加按钮并将其放置在他们想要的位置 我想允许用户保存他们的布局 以便下次打开应用程序时加载它 有谁知道我是否可以将文件保存到 SD 卡上 或者 我可以使用某种layout getXml 方法并将其放入我的应用程序
  • 在应用程序简历中隐藏软键盘

    我有一个 Android 应用程序 使用 Xamarin 用 C 编写 我已将应用程序简化为包含 TextView 和用于横幅广告的 Google admod AdView 的 LinearLayout 我不希望软键盘出现在应用程序中 这不
  • GCM 向主题发送消息:TOO_MANY_TOPICS 错误

    以前 GCM 每个应用程序有 100 万个主题订阅的限制 我发现他们现在已经取消了这一限制 基于发布 订阅模型 主题消息支持 每个应用程序无限订阅 https developers google com cloud messaging to
  • Android第一次动画不流畅

    我正在尝试一个动画将 imageView 从屏幕底部滑动到屏幕中心 但是当我第一次执行此动画时 它不平滑 但当第二次执行动画时 它是正常且平滑的 我几乎尝试了所有方法 但无法解决我的问题 这是我的动画文件
  • Android 应用程序在后台运行时保存数据

    目前我正在开发 xmmp 客户端 当应用程序位于前台时 该客户端工作得很好 但由于事实上 当应用程序处于后台时 我在 Application 类中保存了大量数据 复杂的 ArrayList 字符串和布尔值作为公共静态 每个字段都被垃圾收集
  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • Phonegap - 如何将.txt文件保存在Android手机的根目录中

    我正在尝试使用phonegap 将 txt 文件保存在Android 手机的根目录中 我已经安装了这些插件 cordova plugin file 和 cordova plugin file transfer 在 config xml 文件
  • KitKat(及更低版本)设备上的 Android Material Design

    我将在我们学校开发一个 Android 应用程序作为一个项目 我想使用 Google 的新 Material Design 但我知道它仅适用于 Android L 设备 Jack Underwood 最近发布了名为 Today Calend
  • 在意图过滤器中使用多个操作时的默认值

    尝试理解 Android 中的意图和操作并查看文档 http developer android com guide topics intents intents filters html 但我一直看到的一件事是定义了多个操作的意图过滤器
  • Android 原理图内容提供程序库配置?

    Jake Wharton 在最近的一次演讲中提到了这个库 它看起来是避免大量样板文件的好方法 所以我尝试了一下 但没有任何成功 https github com SimonVT schematic https github com Simo
  • 获取 AlarmManager 中活动的 PendingIntents 列表

    我有办法获取活动列表PendingIntent在设备中 我开始工作AlarmManager我想看看我的PendingIntents 已正确创建和删除 也很高兴看到其他什么PendingIntent在那里 只是为了看看某些应用程序是否正在做一
  • Flutter 深度链接

    据Flutter官方介绍深层链接页面 https flutter dev docs development ui navigation deep linking 我们不需要任何插件或本机 Android iOS 代码来处理深层链接 但它并没
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • Android相机意图:如何获取全尺寸照片?

    我正在使用意图来启动相机 Intent cameraIntent new Intent android provider MediaStore ACTION IMAGE CAPTURE getParent startActivityForR
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • Android 如何聚焦当前位置

    您好 我有一个 Android 应用程序 可以在谷歌地图上找到您的位置 但是当我启动该应用程序时 它从非洲开始 而不是在我当前的城市 国家 位置等 我已经在developer android com上检查了信息与位置问题有关 但问题仍然存在
  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想
  • 在 Android 中,如何将字符串从 Activity 传递到 Service?

    任何人都可以告诉如何将字符串或整数从活动传递到服务 我试图传递一个整数 setpossition 4 但它不需要 启动时总是需要 0 Service 我不知道为什么我不能通过使用 Service 实例从 Activity 进行操作 publ
  • 找到 Android 浏览器中使用的 webkit 版本?

    有没有办法知道某些特定手机上的 Android 浏览器使用的是哪个版本的 webkit 软件 如果有一个您可以浏览以获取该信息的 URL 那就太好了 但任何其他方式也很好 如果你知道 webkit 版本 你就知道 html5 支持多少 至少

随机推荐

  • 数组[1]会发生什么

    我有一大段代码 旨在获取一个数组并对其进行处理 在当前项目中只有一个元素 因此我没有将变量更改为 char 而是将其声明为 char 数组 1 这样 我不需要修改我的代码 也不需要冒添加任何错误的风险 并且如果需求增长 可以轻松地增加它 它
  • 在 C++11 之前,移动语义是如何解决的?

    我最近一直在阅读移动语义以及它是如何引入到 C 11 中的 主要要点是 通过 窃取 临时对象的指针来创建对象 程序可以变得更加高效 这比对临时对象进行深度复制来创建新对象要高效得多 在 C 11 及更高版本 中 这是通过使用右值引用来实现的
  • javascript从X,Y到X1,Y1的平滑动画

    我想慢慢地将图像 或元素 从其实际的 X Y 位置移动到 X1 Y1 当 的时候distanceX 和 X1 之间is equalY 和 Y1 之间的那个很容易 但是 如果 X 差异为 100 像素 Y 差异为 273 像素怎么办 作为 J
  • C++ 中“词法”一词意味着什么?

    我读到有词法常量 词法运算符 词法范围等 术语 词法 如何改变常量 例如字符串文字 任何运算符或某些标识符的范围的含义 词法 意味着它与源代码相关 例如 1是一个词汇常量 奥托 sizeof char 也是一个编译时整型常量表达式 但它不是
  • 在 PHP 中打印小于和大于符号

    我在尝试打印时遇到问题 lt gt 使用 PHP 编写 HTML 中的符号 我正在附加一个字符串
  • 如何向IDEA添加自定义构建脚本?

    有没有一种简单的方法来配置完全自定义的构建过程非Java项目在 IntelliJ IDEA 中 基本上 我只需要运行自定义 shell 命令 而不是任何更智能的构建过程 尝试将这些 shell 命令配置为自定义工具 文件 gt 设置 gt
  • DRF 序列化器字段已重命名为经过验证的数据中的源

    我有一个 drf 序列化器 其中有一个我想重命名的字段 class UserBulkUploadSerializer serializers Serializer is admin serializers BooleanField requ
  • 如何从 waldo::compare() 返回的对象中提取未完成的值?

    我正在尝试使用一个名为的新 R 包waldo https github com r lib waldo 也请参阅 tidyverse 博客 https www tidyverse org blog 2020 10 waldo 旨在比较数据对
  • 如何使用 jQuery 将子元素从一个父元素移动到另一个父元素[重复]

    这个问题在这里已经有答案了 我正在使用 jQuery数据表 http datatables net 插入 我想将搜索框 dataTables filter 和要显示下拉列表的记录数 dataTables length 从其父元素 dataT
  • oracle中如何使用级联

    create table loginDetails userId varchar 30 cellPhoneNo varchar 10 displayName varchar 20 password varchar 20 secretQues
  • Web 服务和用户的 Spring 安全性

    我们有一个 Web 应用程序 我们希望使用 Spring Security 以两种不同的方式保护它 1 使用登录表单进行身份验证并有权访问某些服务的用户 2 使用摘要身份验证保护的其他服务 用户 密码在请求的标头中传递 由其他 Web 应用
  • 如何停止活动的 AutoHotkey 脚本?

    昨天在调试 AutoHotkey 脚本时 我不小心触发了无限循环MouseMove and MouseClick事件 每隔 0 5 秒 我的鼠标就会点击屏幕的随机部分 在尝试使用任务管理器终止 AHK 失败后 我最终关闭了计算机以结束脚本
  • 创建可在任何其他计算机上运行的 jar 文件

    我必须创建一个 jar 文件 其中我需要在类路径 属性文件中添加外部 jar 文件 以便在任何其他计算机上运行它 您可以使用 manifest mf 定义外部类路径 也可以使用组成类路径并运行应用程序的脚本
  • C# 中 char* 转为字符串

    我正在从本机 DLL 调用一个函数 该函数返回一个char 指针 如何将返回的指针转换为字符串 我试过 char c function string s new string c 但它只是返回了一个奇怪的汉字 这不是正确的值c 也许本机 D
  • 尽管 cy.on('uncaught:exception') 但赛普拉斯未捕获断言错误

    关于以下错误 Uncaught Error Script error Cypress detected that an uncaught error was thrown from a cross origin script We cann
  • WIC 和 GDI+ 之间有什么关系?

    我对 Windows Imaging Component WIC 和 GDI 之间的关系很模糊 我过去做过一些工作 表明 WIC 可以生成视觉上优越的 GIF 编码 但令我惊讶的是 与 GDI 相比 我没有看到更多人使用它进行图像处理 我知
  • “IOError:获取中的大小不匹配!”通过 SFTP 检索文件时

    我有一个脚本 用于定期通过 SFTP 检索特定文件 有时 脚本会出错并显示以下输出 Traceback most recent call last File ETL py line 304 in
  • Android Studio 不会更新,说已经是最新版本

    当我尝试在 Android studio 中 检查更新 时 我收到以下消息 您已经安装了最新版本的 Android Studio 预览版 我使用的是 0 5 2 此处列出了最新版本http tools android com downloa
  • 在 Thymeleaf 中创建空数据属性

    我试图在 Thymeleaf 3 0 3 Spring 4 3 7 中使用自定义数据属性创建一个元素
  • BackgroundColorSpan 调整高度或添加填充

    我有一个应用程序 可以在其中显示格式化文本的多行和多个段落TextView 我在用SpannableStringBuilder以此目的 我在这里想做的一件事是能够突出显示文本 现在我尝试使用BackgroundColorSpan 但在这种情