为 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 的一部分设置可绘制背景的主要内容,如果未能解决你的问题,请参考以下文章