4

我有一个 TextView 来显示一段文本,我希望我的应用程序在按下单个单词时使用 TTS 说出单个单词。如果按下时可以突出显示单词会更好看。我已经为每个单词使用 ClickableSpan 实现了它。它几乎可以正常工作,只是播放完成后我看不到如何将突出显示的状态重置为正常状态。每次我单击一个新单词时,前一个单词都会失去突出显示,而新单词会被突出显示,但是一旦 TTS 回调,我不知道如何删除突出显示:

我的文本视图:

<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 处理程序中更改颜色。我将这两种颜色设置为两种几乎相同的颜色。

我的可点击跨度:

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
    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 回答