2

我想在 TextView 中突出显示文本,因为 MediaPlayer 会播放预先录制的文本声音。(如卡拉OK)现在,我只想在声音的开头不覆盖任何文字,在声音的结尾处覆盖所有文字。(我突出显示的文本应该看起来像一个进度条。)

我尝试isPlaying()了 MediaPlayer 对象的方法,为了获取文本的索引,我计算了百分比。

我的代码如下。

while(mediaPlayer.isPlaying())
{
  int percentage = mediaPlayer.getCurrentPosition() / mediaPlayer.getDuration() * 100;
  int end = text.length() * percentage / 100;
  story.setText("Hello world!", BufferType.SPANNABLE);
  Spannable span = new SpannableString(story.getText());
  text = story.getText().toString();
  span.setSpan(new BackgroundColorSpan(0xFF00FF00), 0, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  story.setText(span);
}

这似乎阻塞了线程,因为我的应用程序冻结了。我尝试使用 AsyncTask 但失败了。

你知道我该如何让它工作吗?

4

1 回答 1

1

这可能为时已晚,但迟到总比没有好,您可以通过使用Handlerand 方法来实现Handler#postDelay

 private val runnable = object : Runnable {
    override fun run() {
        val string = textView.text.toString()
        val span = SpannableString(string)
        val end = textView.length() * percentage / 1000
        span.setSpan(BackgroundColorSpan(Color.RED), 0, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
        textView.clearFocus()
        textView.setTextKeepState(span)
        percentage += 1 // to make the percentage increases, you can remove it
        handler.postDelayed(this, 1000)
    }

}

并在任何你喜欢的地方调用这个方法

 handler.postDelayed(runnable, 1000)

离开活动时不要忘记清除回调handler.removeCallbacks(runnable) ,否则会泄漏资源。

当百分比达到 100% 时不要忘记停止删除回调,否则它将永远运行或只是崩溃NullPointerException

祝你好运,快乐编码。

于 2018-04-14T21:31:51.990 回答