如何在Android的SpannableString中设置不透明度/透明度

3
如何使用Android中的SpannableStringBuilder实现跨度文本的透明度/不透明度设置?我希望在一个TextView中实现以下设计:

enter image description here

主文本 当前位置 的不透明度/透明度为1.0,子文本 Kungstan 43 的透明度为84%。
我已经按照以下方式设置了 SpannableStringBuilder
SpannableStringBuilder OriginText = new SpannableStringBuilder();
OriginText.Append(OriginMainText + ", ");
int SubTextIndex = OriginText.Length();
OriginText.Append(OriginSubText);
OriginText.SetSpan(<what need to set here??>, SubTextIndex, OriginText.Length(), 0)

我应该在<这里需要设置什么??>中放置什么对象?最接近的方法是设置前景色,但我更喜欢有一种方法来设置alpha/opacity。


这是一个相当简单的设计。您甚至可以不使用不透明度,只需像您所说的那样更改前景颜色即可实现它。 - Racil Hilan
1
@RacilHilan 是的,只改变前景色会更容易,但这需要我定义两种不同的颜色,而不仅仅是一个带有不同透明度的颜色。这就是为什么我说,如果有一种设置 alpha 的方法,我更喜欢。 - malxatra
是的,但是使用不透明度定义相同的颜色就像定义了两种不同的颜色:)。从我的回答中可以看出,这并不比较省事:)。 - Racil Hilan
2个回答

1
您可以使用TextAppearanceSpan
OriginText.setSpan(new TextAppearanceSpan(...), SubTextIndex, OriginText.Length(), 0);

语法如下:

TextAppearanceSpan(String family, 
                   int style, 
                   int size, 
                   ColorStateList color, 
                   ColorStateList linkColor)

你在这里需要关注的重要参数是ColorStateList color,它的定义如下:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_focused="true"
         android:color="@color/sample_focused" />
   <item android:state_pressed="true"
         android:state_enabled="false"
         android:color="@color/sample_disabled_pressed" />
   <item android:state_enabled="false"
         android:color="@color/sample_disabled_not_pressed" />
   <item android:color="@color/sample_default" />
</selector>

从API 23开始,项目可以选择定义android:alpha属性来修改基础颜色的不透明度,这正是您想要的。例如,以下项目具有84%的不透明度,就像您所希望的一样:

<item android:state_enabled="false"
      android:color="?android:attr/colorAccent"
      android:alpha="0.84" />

要从资源中获取颜色定义,您可以使用以下代码:

ContextCompat.getColor(context, R.color.your_color);

0

改变不透明度的简单方法是将表示不透明度的2个数字连接到表示颜色的6个数字上,例如如果颜色为0xFFFFFF,则半透明(0x80)的相同颜色将为0x80FFFFFF。然后使用setSpan将颜色应用于文本的一部分,如下所示:

spannable.setSpan(new ForegroundColorSpan(color), ...) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接