当按下时,突出显示文本视图中的单词

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更好的方法?
1个回答

2

我终于找到了一个对我有效的技巧。当TextView中的文本颜色改变时,所有的高亮都会被重置。因此,如果我在TTS的回调中触发文本颜色的改变,那么高亮就会被移除。麻烦的是,触发的颜色改变必须是不同的颜色。所以我必须在TTS回调和ClickableSpan的onClick处理程序中同时更改颜色。我将这两种颜色设置为几乎相同的两种颜色。

我的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>

The TextView:

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

Sylvain,你能告诉我如何实现吗?我需要在Toast中显示每个单词。 - Madhav_nimavat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接