2012年5月1日火曜日

Spannable.SPAN_COMPOSING その2

Spannable.SPAN_COMPOSING その2

Spannable.SPAN_COMPOSING sample codeの続編です。

setSpanメソッドの第一引数の値が、第1回目に実行される場合と第2回目に実行される場合とで、同一である場合には、Spannable.SPAN_COMPOSINGの効果はあります。
しかし、別の値になった場合には、Spannable.SPAN_COMPOSINGの効果が無くなり、第1回目の装飾は残ったままになります。

第一引数の値が前回の値と異なる場合には、前回の装飾を消すためにremoveSpanメソッドを使います。

sample codeは次のとおりです。前回のspanをremoveSpanメソッドで削除しているため、setSpanメソッドの第4番目の引数Spannable.SPAN_COMPOSINGはダミー(空間を埋めるためだけを目的とした意味の無い言葉)になります。
public class TextViewSpanRemoveActivity extends Activity
    implements
    OnClickListener
    {
    final int iMaxChar = 255;
    int iCounter;
    Button bu;
    TextView tv;
    SpannableString ss;
    BackgroundColorSpan spanBC;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        int i;
        char c = '亜';
        StringBuilder sb;
        
        bu = (Button)findViewById(R.id.Button);
        bu.setOnClickListener(this);
        tv = (TextView)findViewById(R.id.TextView);
        
        //表示する文字列の作成
        sb = new StringBuilder();
        for(i=0; i<iMaxChar; i++) sb.append(c++);
        
        //装飾の作成
        ss = new SpannableString(sb.toString());
        spanBC = new BackgroundColorSpan(0xff880000);
        
        //第ゼロ番目の文字に装飾を施す。
        iCounter = 0;
        ss.setSpan(spanBC, iCounter, iCounter+1, Spannable.SPAN_COMPOSING);
        tv.setText(ss);
    }


    @Override
    public void onClick(View v) {
        if(v==bu){//クリックした場合
            int i, iRed, iBlue;
            
            //もし、removeSpanメソッドを実行しない場合、
            //前回の装飾はそのまま残り、かつ次の文字も装飾される。
            ss.removeSpan(spanBC);//既に設定されているSpanを消す。
            
            iCounter++;//次の文字に移行する。
            if(iCounter>iMaxChar) iCounter = 0;
            
            //適当に色を変える
            iRed = iCounter & 0x0f;
            iRed = 0x0f - iRed;
            iRed <<= 20;
            iBlue = iCounter % 16;
            iBlue <<= 4;
            i = 0xff000000 + iRed + iBlue;
            spanBC = new BackgroundColorSpan(i);
            
            ss.setSpan(spanBC, iCounter, iCounter+1, Spannable.SPAN_COMPOSING);
            tv.setText(ss);
            return;
        }
    }
}

0 件のコメント:

コメントを投稿