4

テキストの段落を表示するTextViewがあり、TTSを使用して、アプリケーションが押されたときに個々の単語を読み上げるようにしたい。押したときに単語を強調表示できると見栄えが良くなります。単語ごとにClickableSpanを使用して実装しました。再生が完了すると、強調表示された状態を通常にリセットする方法がわからないことを除いて、ほぼ正常に機能します。新しい単語をクリックするたびに、前の単語はハイライトを失い、新しい単語がハイライト表示されますが、TTSがコールバックした後、ハイライトを削除する方法がわかりません。

私のTextView:

<TextView
    android:id="@+id/sentence"
    ...
    android:textColorHighlight="@color/i_blue"
 />

TextViewに入力するには、次を使用します。

SpannableStringBuilder strBuilder = new SpannableStringBuilder();
Iterator<Word> iterator = e.getWordList().iterator();
int wordStart, wordEnd;
while (iterator.hasNext()) {
    Word w =  iterator.next();
    wordStart = strBuilder.length() + w.getPrefix().length();
    wordEnd = wordStart + w.getWord().length();
    strBuilder.append(w.getPrefix() + w.getWord() + w.getSuffix());
    final String currentWord = w.getWord();
    ClickableSpan readWord = new ClickableSpan() {
        private String clickedWord = currentWord;
        public void onClick(View view) {
            Message msg = m_HandlerReadWord.obtainMessage();
            msg.obj = clickedWord;
            m_HandlerReadWord.sendMessage(msg);
        }
        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setUnderlineText(false);
        }
    };
    strBuilder.setSpan(readWord, wordStart, wordEnd, 0);
}
m_SentenceView.setText(strBuilder);
m_SentenceView.setMovementMethod(LinkMovementMethod.getInstance());

また、TTSが単語の再生が完了したときにコールバックすると、このメソッドが呼び出されます。

public void resetHighlight() {
 //What can I do there to reset any highlighted word?
}

私がそれを行う方法はありますか?または、ClickableSpanよりも優れたアプローチはありますか?

4

1 に答える 1

2

私はついに私のために働くトリックを見つけました。TextViewのテキストの色が変わると、すべてのハイライトがリセットされます。したがって、TTSのコールバックでテキストの色の変更をトリガーすると、ハイライトが削除されます。汚い部分は、トリガーされた色の変化が別の色でなければならないということです。そのため、TTSがコールバックするときと、ClickableSpanのonClickハンドラーの両方で色を変更する必要があります。そして、これらの2つの色をほぼ同じ2つの色に設定しました。

私のClickableSpan:

final int AlmostBlack = m_Resources.getColor(R.color.i_black_almost);
ClickableSpan readWord = new ClickableSpan() {
    private int almostBlack = AlmostBlack;
    public void onClick(View view) {
        TextView v = (TextView) view;
        v.setTextColor(almostBlack);
        ...

そして、TTSがコールバックするときのハンドラーで:

m_SentenceView.setTextColor(m_Resources.getColor(R.color.i_black));

TTSや何かがコールバックするのを待たずに、同様のことをしたい場合は、カラー状態リストを使用して、ビューが押されたときまたは離されたときに色の変更をトリガーできます。

カラー状態リスト、res / color / clickable_words.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:color="@color/i_black_almost" android:state_pressed="true"/>
    <item android:color="@color/i_black" />
</selector>

TextView:

<TextView
    android:id="@+id/sentence"
    ...
    android:textColor="@color/clickable_words"
    android:textColorLink="@color/clickable_words"
    android:textColorHighlight="@color/i_blue" />
于 2012-08-13T05:04:15.640 に答える