2012-08-12 65 views
4

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

我的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更好的方法?

回答

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> 

TextView的:

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

西尔你能告诉我怎样才能实现呢?我需要在烤面包上显示每个单词 – 2017-07-22 05:07:49