我有一个ListView,我让我按位置读取位置。 我想滚动到实际上正在阅读的列表位置。
当我开始我的读取方法时,位置立即跳转到最后一个列表位置,bcs tts创建一个语音队列异步然后播放它。
有没有办法同步移动listposition?
_btnspeak.Click += delegate {
//vokabeln is a List of Vokabel
if (vokabeln.Count > 0)
{
// _listpos is the current position in the list
int _listpos = 0;
while (_listpos < vokabeln.Count)
{
Vokabel v = vokabeln.ElementAt(_listpos);
_lvvokabeln.SmoothScrollToPosition(_listpos);
textToSpeechd.Speak(v.DE, QueueMode.Add, null);
textToSpeechd.PlaySilence(200, QueueMode.Add, null);
_listpos += 1;
}
}
};
答案 0 :(得分:1)
如果我理解,你只想在读取列表项时滚动,所以你需要等到读取该项目才能阅读下一个项目。
关于你的问题:
有没有办法同步移动listposition?
正是你正在做的事情,while
循环一直运行到最后(同步),这就是它向下滚动到最后位置的原因。
你需要异步制作它:
b.Click += async delegate { // make the delate async
if(vokabeln.Count > 0)
{
while(_listpos < vokabeln.Count)
{
// do scroll
// do speech
// set here the duration of the speech. 1000 = 1 second
await Task.Delay(3000);
}
}
};
我不知道TextToSpeech API,但最好的情况是,如果你能得到特定演讲的持续时间,那么await Task.Delay(duration)
就像上面的例子一样。
如果您没有该选项,但API会在语音完成/结束时提供事件,而不是while
循环,您可以执行以下操作:
答案 1 :(得分:0)
你可以使用getListView().smoothScrollToPosition(position);
将列表视图滚动到当前位置