字符样式/跨度设置字母间距

ale*_*ett 3 android textview

所述TextView.setLetterSpacing允许信间距/字符间距被设置.

是否有相应的CharacterStyle/span类允许在一个TextView?的文本子集上设置字母间距?

ale*_*ett 6

所以我通过拧自己的span类来解决这个问题,它适用于API级别21及以上.

import android.annotation.TargetApi;
import android.content.Context;
import android.os.Parcel;
import android.text.TextPaint;
import android.text.style.MetricAffectingSpan;

/**
 * Created by alex on 19/02/2015.
 */
@TargetApi(21)
public class LetterSpacingSpan extends MetricAffectingSpan {
    private float letterSpacing;

    /**
     * @param letterSpacing
     */
    public LetterSpacingSpan(float letterSpacing) {
        this.letterSpacing = letterSpacing;
    }

    public float getLetterSpacing() {
        return letterSpacing;
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        apply(ds);
    }

    @Override
    public void updateMeasureState(TextPaint paint) {
        apply(paint);
    }

    private void apply(TextPaint paint) {
        paint.setLetterSpacing(letterSpacing);
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 这允许您在跨度(文本的一部分)上设置 letterSpacing。如果在整个 TextView 上设置 letterSpacing,它将应用于整个 TextView。 (2认同)

Joa*_*usa 5

您可以看一下实现您所需要的自定义类的实现。

编辑:好的,如果您想应用到文本的一小部分,您可以这样做:

CharSequence firstPart = "First Part";
CharSequence thirdPart = "Third Part";
SpannableStringBuilder middlePart = new SpannableStringBuilder("Middle Part");

int spacing = 2;
final String nonBreakingSpace = "\u00A0";


for (int i = middlePart.length() - 1; i >= 1; i--){
    middlePart.insert(i, nonBreakingSpace);
    middlePart.setSpan(new ScaleXSpan(spacing), i, i + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}

((TextView) rootView.findViewById(R.id.text_view)).setText(TextUtils.concat(firstPart, " ", middlePart, " ", thirdPart));
Run Code Online (Sandbox Code Playgroud)

不过,这并不完美。

编辑:

需要明确的是,这是上面代码的结果

第一行(“自定义Spannable”)是上述代码的(+/-)结果。第二行(“字母间距”)是属性的结果android:letterSpacing="1"

在此处输入图片说明

如您所见,正如我所说,这并不完美,但它是我发现的棒棒糖前置设备的唯一解决方案。

我还认为您的问题的全部重点是使它与棒棒糖之前的设备兼容。我的错。

干杯