为 TextView 的一部分设置可绘制背景

Posted

技术标签:

【中文标题】为 TextView 的一部分设置可绘制背景【英文标题】:Set drawable background for a portion of TextView 【发布时间】:2021-03-13 05:40:44 【问题描述】:

我在 Textview 中为 android:background 属性创建了一个自定义可绘制对象。 但是我只希望 TextView 的某个部分而不是整个 TextView 的可绘制背景

到目前为止完成的工作:

目标:我想实现这样的目标(即只为 substring(1,2) 的文本设置背景):

这就是我目前取得的成果:

overline.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:bottom="-2dp"
        android:left="-2dp"
        android:right="-2dp"
        android:top="1dp">
        <shape android:shape="rectangle">
            <stroke
                android:
                android:color="#030310" />
        </shape>
    </item>
</layer-list>

layout.xml

<TextView
    android:id="@+id/myTextView"
    android:layout_
    android:layout_
    android:background="@drawable/overline"
    android:textColor="#030310"
    android:text="Hello"/>

这是我到目前为止所尝试的:

SpannableString ss = new SpannableString("Hello");

Drawable d = ContextCompat.getDrawable(((MainActivity) getActivity()).getApplicationContext(), R.drawable.overline);
d.setBounds(0, 0, 30, 30);

ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
ss.setSpan(span, 1, 2, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

myTextView.setText(ss);

我不太了解 ImageSpan,因此这是我在尝试上述代码后得到的结果(我在从 MainActivity 加载的 Fragment 中编写此代码),

【问题讨论】:

【参考方案1】:

不幸的是,据我所知,没有现成的 Android 解决方案可以满足您的需求。您在查看 span 方面做得很好,但是 span 提供了对底层 TextPaint 的访问,并且只能真正做到 TextPaint 可以做的事情。 ReplacementSpan 是个例外,它完全替换了跨区文本。您的 ImageSpan 是一个 ReplacementSpan,因此矩形会替换所有文本并且不会像预期的那样覆盖。

有几种方法可以满足您的要求,但Drawing a rounded corner background on text 中概述了我更喜欢的一种方法。这将是一个通用的解决方案,但您需要对其进行调整以使圆形背景成为您的上划线。

如果这对您来说太过分了,并且您的文本视图足够简单,并且您知道要绘制的线条不会跨越线条边界,您也可以查看this。

您还可以创建一个简单的视图,它的宽度为2dp,宽度与您需要的宽度一样,用背景覆盖字母并以编程方式移动它。自定义 View 也可以覆盖所有文本,您可以在视图的 onDraw() 函数中绘制线条。 TextView StaticLayout 可以帮助确定应在自定义视图中的何处绘制线条。

如果您搜索它们,我相信网上还有其他可用的解决方案。

【讨论】:

感谢您的快速回复,我遇到了一些事情。我一定会调查的,谢谢!

以上是关于为 TextView 的一部分设置可绘制背景的主要内容,如果未能解决你的问题,请参考以下文章

Android L 忽略形状作为可绘制背景

如何将可绘制背景设置为仅将数字字符串转换为 android 中的另一个字符串?

使用复合可绘制对象在 TextView 中设置实际文本填充

形状可绘制为背景,底部有一条线

视图中背景可绘制图像的不透明度(使用 XML 布局)

Textview drawable 不在远程视图中显示可绘制图像