下記のように数値の部分だけを大きくすることを考えてみます(数値はAPIから渡される仕様)。
そもそもSpan
とは
スパンは、文字または段落レベルでテキストのスタイルを設定するために使用できる強力なマークアップオブジェクトです。テキストオブジェクトにスパンをアタッチすることにより、色の追加、テキストのクリック可能化、テキストサイズの拡大縮小、カスタマイズされた方法でのテキストの描画など、さまざまな方法でテキストを変更できます。
Spanの種類は20パターン以上あるようなので、詳細が気になる方は公式サイトをご覧ください。
Spans | Android Developers
コード
TextViewの拡張関数として実装する
fun TextView.changeSizeOfText(target: String, size: Int){
// 対象となる文字列を引数に渡し、SpannableStringBuilderのインスタンスを生成
val spannable = SpannableStringBuilder(target + "hPa")
// Spanを組み込む
spannable.setSpan(
AbsoluteSizeSpan(size, true),
0, // start
target.length, // end
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
// TextViewにSpannableStringBuilderをセット
text = spannable
}
解説
肝となるのはsetSpan()
で、
- 第1引数:スタイルをどう変更するか
- 第2引数:変更の開始位置
- 第3引数:変更の終了位置
- 第4引数:影響範囲
をそれぞれ指定します。中身を見に行くとこんな感じ↓
public void setSpan(Object what, int start, int end, int flags)
第1引数で渡しているAbsoluteSizeSpan()
は文字のサイズを絶対値で変化させる際に使うもので、第2引数dip
にtrue
を渡すと、デバイスに依存しないピクセルサイズを設定することができます。(dip
はdevice-independent pixels
の略)
第4引数の「影響範囲」については、基本的にSpanned.SPAN_EXCLUSIVE_EXCLUSIVE
を渡しておけば大丈夫そうです(というか自分は他の定数を使ったことがないです…)。
呼び出す
viewModel.pressure.value?.let { pressure -> //APIから渡される数値の文字列
binding.textView.changeSizeOfText(pressure, 50)
}
これで無事TextViewの一部をサイズ変更することができました。