Android の文字間の間隔を調整する方法はありTextView
ますか? これは通常「カーニング」と呼ばれていると思います。
私はandroid:textScaleX
属性を認識していますが、それは文字を間隔とともに圧縮します。
CharSequence
を使用せずに任意の文字列にカーニングを適用する簡単な方法 (技術的には ) を誰かが探している場合TextView
:
public static Spannable applyKerning(CharSequence src, float kerning)
{
if (src == null) return null;
final int srcLength = src.length();
if (srcLength < 2) return src instanceof Spannable
? (Spannable)src
: new SpannableString(src);
final String nonBreakingSpace = "\u00A0";
final SpannableStringBuilder builder = src instanceof SpannableStringBuilder
? (SpannableStringBuilder)src
: new SpannableStringBuilder(src);
for (int i = src.length() - 1; i >= 1; i--)
{
builder.insert(i, nonBreakingSpace);
builder.setSpan(new ScaleXSpan(kerning), i, i + 1,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return builder;
}
AFAIK、でカーニングを調整することはできませんTextView
。Canvas
2DグラフィックAPIを使用して自分でテキストを描画すると、カーニングを調整できる場合があります。
カーニングを調整する唯一の方法は、グリフ アドバンスが変更されたカスタム フォントを作成することです。
SpannedStringを使用することもできますが、それを解析して各単語の文字間隔を変更する必要があります
@PedroBarros の回答を使用したかったのですが、間隔をピクセル単位で定義する必要がありました。
applySpacing メソッドの編集は次のとおりです。
private void applySpacing() {
if (this == null || this.originalText == null) return;
Paint testPaint = new Paint();
testPaint.set(this.getPaint());
float spaceOriginalSize = testPaint.measureText("\u00A0");
float spaceScaleXFactor = ( spaceOriginalSize > 0 ? spacing/spaceOriginalSize : 1);
StringBuilder builder = new StringBuilder();
for(int i = 0; i < originalText.length(); i++) {
builder.append(originalText.charAt(i));
if(i+1 < originalText.length()) {
builder.append("\u00A0");
}
}
SpannableString finalText = new SpannableString(builder.toString());
if(builder.toString().length() > 1) {
for(int i = 1; i < builder.toString().length(); i+=2) {
finalText.setSpan(new ScaleXSpan(spaceScaleXFactor), i, i+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
super.setText(finalText, BufferType.SPANNABLE);
}
私は Android 開発者として初心者です。これが良くない場合は、お気軽にお知らせください。
@Pedro Barrosの回答の小さな編集があります。SpannableString を使用して設定すると便利です。たとえば、一部の文字の色を変えたい場合などです。
private void applySpacing() {
SpannableString finalText;
if (!(originalText instanceof SpannableString)) {
if (this.originalText == null) return;
StringBuilder builder = new StringBuilder();
for (int i = 0; i < originalText.length(); i++) {
builder.append(originalText.charAt(i));
if (i + 1 < originalText.length()) {
builder.append("\u00A0");
}
}
finalText = new SpannableString(builder.toString());
} else {
finalText = (SpannableString) originalText;
}
for (int i = 1; i < finalText.length(); i += 2) {
finalText.setSpan(new ScaleXSpan((spacing + 1) / 10), i, i + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
super.setText(finalText, TextView.BufferType.SPANNABLE);
}