Android SPAN_EXCLUSIVE_EXCLUSIVEを調べてみる

2019年8月29日

テキストの文字サイズや色などを一部変更するときに
SpannableStringBuilderクラス を利用するが
文字を追加などする場合の引数に
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
という定数を入れる

これはどういう動きをするんだい?
ってことで調べてみた。

対象は以下4つの定数。

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
Spannable.SPAN_EXCLUSIVE_INCLUSIVE
Spannable.SPAN_INCLUSIVE_EXCLUSIVE
Spannable.SPAN_INCLUSIVE_INCLUSIVE

SPAN_EXCLUSIVE_INCLUSIVEは右側に影響する

String right = "右:";
String rightArrow = "→";

SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();

// "右:"を追加して文字サイズを2倍する
spannableStringBuilder.append(
        right,
        new RelativeSizeSpan(2.0f),
        Spannable.SPAN_EXCLUSIVE_INCLUSIVE
);
spannableStringBuilder.append(rightArrow); // 最後尾に"→"を追加する
spannableStringBuilder.append(rightArrow);
spannableStringBuilder.append(rightArrow);

TextView tv = findViewById(R.id.tv_id);
tv.setText(spannableStringBuilder);

「右:→→→」という文字列を作っているだけの処理。

Spannable.SPAN_EXCLUSIVE_INCLUSIVE
コードにある上記定数を指定すると、矢印の文字サイズは2倍になる。

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
を指定すると、矢印の文字サイズは2倍にならない。

実際に見てみると分かる

 

追加文字に影響がある

Spannable.SPAN_EXCLUSIVE_INCLUSIVE
or
Spannable.SPAN_INCLUSIVE_INCLUSIVE
を指定した場合

 

追加文字に影響なし

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
or
Spannable.SPAN_INCLUSIVE_EXCLUSIVE
を指定した場合

EXCLUSIVE_INCLUSIVE や INCLUSIVE_INCLUSIVE のように
INCLUSIVE が右側にある場合
右側に追加される文字が影響をうけるようだ

 

SPAN_INCLUSIVE_EXCLUSIVEは左側に影響する

String left = ":左";
String leftArrow = "←";

SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();

// ":左"を追加して文字サイズを2倍する
spannableStringBuilder.append(
        left,
        new RelativeSizeSpan(2.0f),
        Spannable.SPAN_EXCLUSIVE_INCLUSIVE
);
spannableStringBuilder.insert(0, leftArrow); // 先頭に"←"を差し込む
spannableStringBuilder.insert(0, leftArrow);
spannableStringBuilder.insert(0, leftArrow);

TextView tv = findViewById(R.id.tv_id);
tv.setText(spannableStringBuilder);

先ほどと逆で先頭に”←”を差し込む処理にした。

実際に画像をみる。

 

追加文字に影響がある

Spannable.SPAN_EXCLUSIVE_INCLUSIVE
or
Spannable.SPAN_INCLUSIVE_EXCLUSIVE
を指定した場合

 

追加文字に影響なし

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
or
Spannable.SPAN_EXCLUSIVE_INCLUSIVE
を指定した場合

INCLUSIVE が左側にある場合
左側に追加される文字が影響をうけるということで
想定通りの結果になる

 

SPAN_EXCLUSIVE_INCLUSIVEを指定して倍々にしてみる

String right = "右:";
String rightArrow = "→";

SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();

// "右:"を追加して文字サイズを1.5倍する
spannableStringBuilder.append(
        right,
        new RelativeSizeSpan(1.5f),
        Spannable.SPAN_EXCLUSIVE_INCLUSIVE
);

// 最後尾に"→"を追加し文字サイズを1.5倍する(×3回)
for (int i = 0; i < 3; ++i) {
    spannableStringBuilder.append(
            rightArrow,
            new RelativeSizeSpan(1.5f),
            Spannable.SPAN_EXCLUSIVE_INCLUSIVE
    );
}

TextView tv = findViewById(R.id.tv_id);
tv.setText(spannableStringBuilder);

実用的ではないが、文字追加するたびに倍にして遊んでみる。
2倍だとかなりでかくなるので、1.5倍にしてみた。

開発日記

Posted by konp