2012-08-12 91 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