与tts android相关的滚动视图



如何滚动与tts相关的视图(recyclerview),我看了onUtterance,但它似乎只有一个开始和停止的监听器,所以我需要跳出框框思考,我给我的tts一个来自像这样的数组列表的字符串

ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < SpeakRecyclerGrid.recyclerView.getChildCount(); i++) 
{
list.add(((EditText) SpeakRecyclerGrid.recyclerView.getChildAt(i)).getText().toString());
}
speakWords(words);

我正在考虑将字符串分割成多个部分,然后一次将其提供给TTS一个字符串,并在进行时移动视图。我已经为网格布局管理器提供了一个列数(称为列)的int。数组列表在每个单词后面都添加了一个逗号,所以我想的是类似的东西

  • 查找第n/(列)逗号
  • 分开绳子
  • 检查tts是否在说话,并监听onUtterance onDone以传递新字符串
  • 读取字符串
  • 移动视图

并一直这样做,直到没有剩下的单词,并为剩下的单词编码%我不知道如何完成所有这些,所以如果有人想帮忙,请放心,(我想我正在查看StringUtils,并用for循环创建每个较小的字符串,并将它们传递给onUtteranceListener onDone中的tts,但我对android还是有点陌生),但主要是有人有更好的方法吗

好吧,这是我到目前为止所拥有的,但它可能需要一些工作。我还是一个业余爱好者,我已经根据屏幕的大小将字符串分割成块,滚动屏幕的处理程序取决于每个分割字符串中的字母数量,此外,smoothcolltoposition是滚动一个自定义布局管理器,滚动速度相当慢。我有一个问题,尽管在一些设备上,计数单词的数组列表只会达到20个,不确定为什么,但我会问,希望在我修复它时更新它,所以这是我的说话和移动方法

public void speakAndMove(){
final ArrayList<String> list = new ArrayList<>();
SpeakGrid.recyclerView.getLayoutManager().scrollToPosition(0);
for (int i = 0; i < SpeakRecyclerGrid.recyclerView.getChildCount(); i++) {
list.add(((EditText) SpeakRecyclerGrid.recyclerView.getChildAt(i)).getText().toString());
}
Integer numOfWords = list.size();
words = list.toString();
Integer count = 0;
Integer startPoint = 0;
scrollPos = 0;
final Integer speed = words.length() * 15;
Integer leftOver = 0;
final int columns = getResources().getInteger(R.integer.grid_columns);
System.out.println(numOfWords);
ArrayList<String> arrayList = new ArrayList<>();
if (list.size() <= columns) {
if (words.contains("[]")) {
speakWords("");
} else if (words.contains(", 's")) {
formatString = words.replaceFirst(", 's", "'s");
speakWords(formatString);
} else if (words.contains(", ing")) {
formatString = words.replaceFirst(", ing", "ing");
speakWords(formatString);
} else {
speakWords(words);
}
}
if (list.size()>=columns) {
for (int i = 0; i < words.length(); i++) {
if (words.charAt(i) == ',') {
count++;
if (count == columns) {
String ab = words.substring(startPoint, i + 1);
//speakWords(ab);
if (ab.contains(", 's")) {
formatString = ab.replaceFirst(", 's", "'s");
speakWords(formatString);
} else if (ab.contains(", ing")) {
formatString = ab.replaceFirst(", ing", "ing");
speakWords(formatString);
} else {
speakWords(ab);
}
startPoint = i + 1;
count = 0;
leftOver = words.length() - startPoint;
}

//SpeakGrid.recyclerView.getLayoutManager().scrollToPosition(scrollPos);
System.out.println("main string"+" scroll " + scrollPos + " startpoint " + startPoint +" speed " + speed);
}
}
if (leftOver > 0) {
String ab2 = words.substring(startPoint, words.length());
//speakWords(ab2);
if (ab2.contains(", 's")) {
formatString = ab2.replaceFirst(", 's", "'s");
speakWords(formatString);
} else if (ab2.contains(", ing")) {
formatString = ab2.replaceFirst(", ing", "ing");
speakWords(formatString);
} else {
speakWords(ab2);
}
//SpeakGrid.recyclerView.getLayoutManager().scrollToPosition(scrollPos);
System.out.println("leftovers "+ leftOver + " scroll " + scrollPos + " startpoint " + startPoint +" count " + scrollPos);
count = 0;
//scrollPos = 0;
}
}
final Handler h = new Handler();
h.postDelayed(new Runnable() {
public void run() {
// This method will be executed once the timer is over
// Start your app main activity
scrollPos = scrollPos + columns;
SpeakGrid.recyclerView.getLayoutManager().smoothScrollToPosition(SpeakGrid.recyclerView, null ,scrollPos);
System.out.println("position "+ scrollPos + " speed " + speed + " list size " + list.size());
if (scrollPos < list.size())
h.postDelayed(this,speed);
// close this activity
}
}, speed);

} 

最新更新