テキストビューの文字間隔を変更するにはどうすればよいですか?


127

テキストビューの文字間隔を変更するにはどうすればよいですか?HTMLテキストが含まれている場合に役立ちます(コードでwebviewを使用できません)。

PS HTMLテキストのテキストビューで自分の書体を使用しています。


5
レイアウトエディターandroid:letterSpacing=".05"では、Photoshopの
Jacksonkr

回答:


26

android:textScaleXをチェックしてください

必要な間隔に応じて、これが役立つ場合があります。これは、TextViewの文字間隔にリモートで関連する唯一のものです。

編集: 参照してください。JerabekJakubの応答@更新、より良い方法については、以下のは、(ロリポップ)API 21で始まるこれを行うには


9
それを文字間隔にどのように変換しますか?
エリックノビンズ

92
文字/文字間のスペースを増減する方法はありますか?textScaleX-文芸は文字/文字をスケーリングします。
Kaymatrix 2012

2
@Bartsの回答は、質問の内容を実行します
bkurzius 14年

2
X軸のテキストのスケーリングは、Androidでカーニングやトラッキングを処理する適切な方法ではありません。これを達成するロリポップ用のAPIがありますが、ロリポップの前に、これを達成するにはカスタムテキストビューが必要になります。
エリオット

2
このソリューションがどのようにして多くの賛成票(+ 33、-24)を獲得したのかはわかりません。letterSpacingvs textScaleXなんという大きな違い
Jimit Patel 2017

230

API 21以降、オプションセットの文字間隔があります。メソッドsetLetterSpacingを呼び出すか、属性letterSpacingを使用してXMLに設定できます。


1
これは、XMLで設定した場合は実際には機能しません。:私はこのようなエラーが出る"1.2dp" in attribute "letterSpacing" cannot be converted to float."
dopatraman

20
@dopatramanユニットを省略し、値だけを入力する必要があります:android:letterSpacing = "1.2dp"ではなくandroid:letterSpacing = "1.2"
JerabekJakub

12
デバイスの31%がAPI 21をサポートしていないことを知って、以前のバージョンでこれをどのように行いますか?
忍者

25
letterSpacingの値はdp / spではなく、「EM」単位であることに注意してください。わずかな拡張の一般的な値は約0.05です。負の値はテキストを引き締めます。
クリスタン

25
何らかの理由letterSpacingで、ASプレビューで変更されませんでした。変更を確認するには、実際にアプリを物理デバイスで実行する必要がありました。
Drew Szurko

46

より多くのスペース:

  android:letterSpacing="0.1"

少ないスペース:

 android:letterSpacing="-0.07"

2
デフォルトのletterSpacingとは何ですか?
Shivam


おそらく、@ Evin1_のコメントをurの回答に追加する
Sarthak Mittal

サポートされている最大および最小のletterSpacingは何ですか?
ジミットパテル

26

この回答はペドロの回答に基づいていますが、テキスト属性がすでに設定されている場合にも機能するように調整されています。

package nl.raakict.android.spc.widget;
import android.content.Context;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ScaleXSpan;
import android.util.AttributeSet;
import android.widget.TextView;


public class LetterSpacingTextView extends TextView {
    private float letterSpacing = LetterSpacing.BIGGEST;
    private CharSequence originalText = "";


    public LetterSpacingTextView(Context context) {
        super(context);
    }

    public LetterSpacingTextView(Context context, AttributeSet attrs){
        super(context, attrs);
        originalText = super.getText();
        applyLetterSpacing();
        this.invalidate();
    }

    public LetterSpacingTextView(Context context, AttributeSet attrs, int defStyle){
        super(context, attrs, defStyle);
    }

    public float getLetterSpacing() {
        return letterSpacing;
    }

    public void setLetterSpacing(float letterSpacing) {
        this.letterSpacing = letterSpacing;
        applyLetterSpacing();
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        originalText = text;
        applyLetterSpacing();
    }

    @Override
    public CharSequence getText() {
        return originalText;
    }

    private void applyLetterSpacing() {
        if (this == null || this.originalText == null) return;
        StringBuilder builder = new StringBuilder();
        for(int i = 0; i < originalText.length(); i++) {
            String c = ""+ originalText.charAt(i);
            builder.append(c.toLowerCase());
            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((letterSpacing+1)/10), i, i+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
        super.setText(finalText, BufferType.SPANNABLE);
    }

    public class LetterSpacing {
        public final static float NORMAL = 0;
        public final static float NORMALBIG = (float)0.025;
        public final static float BIG = (float)0.05;
        public final static float BIGGEST = (float)0.2;
    }
}

プログラムで使用したい場合:

LetterSpacingTextView textView = new LetterSpacingTextView(context);
textView.setSpacing(10); //Or any float. To reset to normal, use 0 or LetterSpacingTextView.Spacing.NORMAL
textView.setText("My text");
//Add the textView in a layout, for instance:
((LinearLayout) findViewById(R.id.myLinearLayout)).addView(textView);

これは実際に文字の間にスペースが追加されていますか?ブー...誰かがこのテキストをコピーすると、余分なスペースが含まれます。喜びなし
johnw182 2014年

nullチェックインが必要ですapplyLetterSpacingが、それ以外はライフセーバーです!
Bart van Nierop、2015

uがテキストの後ワードを設定し、プログラムで間隔を適用すると機能しない
ジョナサン

@jonneyすべきだ、私はそれをそのように機能させている。例を送っていただけませんか?
Bart Burg

1
ノーブレークスペース-"\ u00A0"-は本当に便利です。ありがとう
Shayan_Aryan 2016

11

API> = 21の後、TextViewによって提供されるinbuildメソッドが呼び出されます setLetterSpacing

詳細はこちらチェック


3
<21で同じにする方法
Rahul Devanavar 2017年

2
if(Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP){this.setLetterSpacing(getResources()。getDimension(R.dimen.letter_spacing)); } else {this.setTextScaleX(getResources()。getDimension(R.dimen.letter_spacing)); }
Maulik Patel


0

Androidはそのようなことをサポートしていないので、FontCreatorを使用して手動で行うことができます。フォントを修正するための良いオプションがあります。このツールを使用してカスタムフォントを作成しました。時間がかかる場合でも、プロジェクトでいつでも使用できます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.