1. 1. 如何实现 “中间这几个字要加粗,但是不要太粗,比较纤细的那种粗” ?
    1. 1.1. “能让文字加粗吗?”
    2. 1.2. “不不不,不是整体加粗,只要中间这几个字,就跑车x1,其他文字不变”
    3. 1.3. “为什么加粗会这么粗,iOS没有这么粗啊,不要这么粗,要纤细的那种粗”

如何实现 “中间这几个字要加粗,但是不要太粗,比较纤细的那种粗” ?

分享一个最近做业务遇到的简单又蛮有意思的的文本显示处理过程。具体就是有这么一段话,类似“转盘抽奖获得跑车x1,点击领取~”,用TextView显示。

“能让文字加粗吗?”

“可以”,然后加上了粗体属性android:textStyle=”bold”。

1
2
3
4
5
6
7
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#252525"
android:textSize="19sp"/>

不放截图了,效果你知道的。

“不不不,不是整体加粗,只要中间这几个字,就跑车x1,其他文字不变”

“OK”,因为变成了文字分段显示成不同样式了,所以我换用了span来处理。

1
boldText.setText(new Spanny().append("Bold",new StyleSpan(Typeface.BOLD)));

“为什么加粗会这么粗,iOS没有这么粗啊,不要这么粗,要纤细的那种粗”

“@¥#%@@*&!微笑😊”
为什么会比iOS的粗,因为是系统字体不一样的原因,iOS 用的是Helvetica,安卓字体是Roboto,其字体本身就设计加粗效果就是这么粗。就没有办法了吗?有的。

  1. 可以换字体,比如light字体。但是不支持局部的加粗,总不能把文字切成3个textview来显示吧,不实际。×
  2. span+画笔处理。 √
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //没错,就几行代码这么简单
    public class FakeBoldSpan extends CharacterStyle {

    @Override
    public void updateDrawState(TextPaint tp) {
    tp.setFakeBoldText(true);//一种伪粗体效果,比原字体加粗的效果弱一点
    //tp.setStrokeWidth(mTextWidth);//有需要的话也可以精确控制字体粗细度
    }
    }
    //使用:
    fakeBoldText.setText(new Spanny().append("FakeBold",new FakeBoldSpan()));

如图,依次是普通字体,加粗字体,比较纤细的那种粗——

顺便推荐一个好用的Span工具类Spanny,可以便捷地将span设置到String上,具体可参考文中代码。