2011年8月11日木曜日

Android Spannable を使って文字列の一部を装飾する

SpannableStringBuilder を使って、文字列の一部を装飾(bold, italic, typeface, color, size) することができます。

こんな感じ。

  1. public class SpannableSampleActivity extends Activity {  
  2.   
  3.  private static StyleSpan sBoldStyleSpan = new StyleSpan(Typeface.BOLD);  
  4.  private static TypefaceSpan sSerifTypefaceSpan = new TypefaceSpan("serif");  
  5.   
  6.  @Override  
  7.  public void onCreate(Bundle savedInstanceState) {  
  8.    super.onCreate(savedInstanceState);  
  9.    setContentView(R.layout.main);  
  10.   
  11.    TextAppearanceSpan cyanTextAppearanceSpan =  
  12.        new TextAppearanceSpan(this, R.style.MyTextAppearance);  
  13.   
  14.    SpannableStringBuilder sb = new SpannableStringBuilder();  
  15.    sb.append(getString(R.string.pretext) + " ");  
  16.   
  17.    int start = sb.length();  
  18.    sb.append(getString(R.string.boldtext));  
  19.    sb.setSpan(sBoldStyleSpan, start, sb.length(),  
  20.        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  21.   
  22.    sb.append(" " + getString(R.string.posttext) + " ");  
  23.   
  24.    start = sb.length();  
  25.    sb.append(getString(R.string.seriftext));  
  26.    sb.setSpan(sSerifTypefaceSpan, start, sb.length(),  
  27.        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  28.   
  29.    sb.append(" " + getString(R.string.posttext) + " ");  
  30.   
  31.    start = sb.length();  
  32.    sb.append(getString(R.string.cyantext));  
  33.    sb.setSpan(cyanTextAppearanceSpan, start, sb.length(),  
  34.        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  35.   
  36.    sb.append(" " + getString(R.string.posttext));  
  37.   
  38.    ((TextView)findViewById(R.id.textview)).setText(sb);  
  39.  }  
  40. }  


res/values/styles.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3. <style name="MyTextAppearance" parent="@android:style/TextAppearance">  
  4.  <item name="android:textColor">#00ffff</item>  
  5.  <item name="android:textSize">30sp</item>  
  6.  <item name="android:textStyle">italic</item>  
  7. </style>  
  8. </resources>  




SpannableStringBuilder には複数の Span が設定可能で、それぞれ setSpan() メソッドで設定できます。

設定されている Span オブジェクトの一覧は getSpans() メソッドで取得でき、特定の Span オブジェクトの設定されている開始位置や終了位置、フラグなどは getSpanStart(), getSpanEnd(), getSpanFlags() で取得できます。 Span を削除する場合は removeSpan() を呼び出します。

SpannalbeStringBuilder の Span 操作


setSpan() の4つ目の引数で、この span の範囲内に文字が挿入されたときにどう振舞うかを指定することができます。指定できるフラグは Spanned に定義されている SPAN_* の定数のうち次の5個です。
  • SPAN_INCLUSIVE_EXCLUSIVE
  • SPAN_INCLUSIVE_INCLUSIVE
  • SPAN_EXCLUSIVE_EXCLUSIVE
  • SPAN_EXCLUSIVE_INCLUSIVE
  • SPAN_PARAGRAPH


SpannableStringBuilder の文字列操作
  • append()
  • insert()
  • replace()

など

Span オブジェクトとして指定できるクラスとしていくつかあります。
  • StyleSpan
    bold, italic を指定
  • TypefaceSpane
    "monospace", "serif", "sans-serif" を指定
  • TextAppearanceSpan
    文字の色、サイズ、style、typeface を一致する TextAppearance リソースに設定
  • AbsoluteSizeSpan
  • RelativeSizeSpan
  • ReplacementSpan
  • ScaleXSpan
  • SubscriptSpan
  • SuperscriptSpan


StyleSpan を使うときの注意点として、このスタイルが累積するものなので、例えば bold と italic 両方を別々の span で設定したり、ベースのスタイルが bold で italic の span を呼び出した場合、 bold italic になります。ベーススタイルからのスタイルはオフにすることができません。

コンストラクタの引数でスタイルを設定します。設定できるスタイルは Typeface クラスで定義されている次の4個です。


TypefaceSpane のコンストラクタで指定できる family は次の3個です。
  • "monospace"
  • "serif"
  • "sans-serif"


TextAppearanceSpan には、文字の typeface、大きさ、色を引数で指定する

- public TextAppearanceSpan (String family, int style, int size, ColorStateList color, ColorStateList linkColor)

と、TextAppearance のリソース ID を指定する

- public TextAppearanceSpan (Context context, int appearance)

- public TextAppearanceSpan (Context context, int appearance, int colorList)

があります。


0 件のコメント:

コメントを投稿