マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

自作エディタを目指して その5

今回は未確定文字列の取得と描画をやってみた。未確定文字列を全部消すとエラーになったりと課題は残っているが。

 とりあえず、未確定文字列だが、InputConnectionのsetComposingTextの引数のCharSequence textで渡される。最初はただの文字列が入ってるだけかと思ったのだが、その正体はSpannableStringだった。SpannaleStringを調べてみると、背景色や下線などのスタイル情報を内部に持ってるようなので、これを使ってみた。スタイル情報はCharacterStyleが持っているので、こいつを取得して、この情報をもとに描画だがupdateDrawStateを使えば何のスタイル情報を持っているかを意識せずに未確定文字列の描画ができる。しかし、どうやらCharacterStyleは1つのスタイル情報しか持たないのと、updateDrawStateで保持できる状態が1つしかないのか、下のソースどおりにやると文字列に下線しかでない。漢字変換中の文字列は背景色も変わるはずなので、これは困る。自分で描画を行わないといけないのかな?あと、間違ってることに気づいたが、下のソースだとdrawTextで毎回同じ場所に描画しようとしているな。これはまずい

@Override
public boolean setComposingText(CharSequence text, int newCursorPosition){
    boolean ret = super.setComposingText(text, newCursorPosition);

    if(text instanceof SpannableString){
        notDecision = (SpannableString)text;
        invalidate();
    }
            
    return ret;
}
@Override
protected void onDraw(Canvas canvas){
    TextPaint paint = new TextPaint();
        
    String text = notDecision.toString();
    if(text.length() > 0){
        Object[] objs = notDecision.getSpans(0, text.length(), Object.class);

        for(Object obj : objs){
            if(!(obj instanceof CharacterStyle)){
                 continue;
            }

            CharacterStyle style = (CharacterStyle)obj;
                
            style.updateDrawState(paint);
            int start = notDecision.getSpanStart(style);
            int end = notDecision.getSpanEnd(style);
            canvas.drawText(text.substring(start, end), 0, 16, paint);
        }
    }
}