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

l2osamch  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(377)

我为您定制了一款 android:background 属性。但是,我只想为textview的某一部分而不是整个textview绘制背景
迄今为止完成的工作:

目标:我想实现这样的目标(即只为 substring(1,2) (正文):

我就是这样取得现在的成绩的:
上划线.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:width="1dp"
                android:color="#030310" />
        </shape>
    </item>
</layer-list>

布局.xml

<TextView
    android:id="@+id/myTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    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,因此这是我在尝试上面的代码后得到的(我在一个 Fragment 加载自 MainActivity ),

oug3syen

oug3syen1#

不幸的是,据我所知,没有现成的android解决方案可以满足您的需求。您可以很好地查看span,但是span提供了对底层textpaint的访问,并且只能真正执行textpaint可以执行的操作。例外情况是replacementspan,它将全部替换已跨越的文本。您的imagespan是一个replacementspan,因此矩形将替换所有文本,并且不会像预期的那样覆盖。
有几种方法可以满足你的要求,但我更喜欢的方法是在文本上画一个圆角背景。这将是一个普遍的解决方案,但你需要调整它,使您的上划线绘制圆形背景。
如果你觉得这太过分了,而且你的文本视图很简单,你知道你想画的线不会跨越线的边界,你也可以看看这个。
您还可以创建一个简单的视图 2dp 宽度和你所需要的宽度,以覆盖一个背景的字母,并以编程方式移动它。自定义视图也可以覆盖所有文本,您可以在视图的 onDraw() 功能。textviewstaticlayout有助于确定在自定义视图中应在何处绘制线。
我敢肯定,有其他的解决方案,如果你在网上搜索他们。

相关问题