我正在开发一个文档阅读器应用,希望用户能够请求应用自动滚动文档,而不是手动滚动。请问有什么想法可以使ScrollView实现垂直“自动滚动”,就像电影结尾的字幕一样。我设置了一个TimerTask,但我的问题是:
在AsynTask中,我遇到了一个错误,但是当我直接在我的Runnable中运行代码时,它按预期工作。我仍然关心效率,并且真的想使用AsynTask。有没有修复AsynTask代码的提示?
顺便说一下:这是我的观察(对于像我这样的新手)。以前我使用了
如何获取增量值以将其提供给TimerTask,即每次运行TimerTask时应该到达的新位置。
是否有更好的方法来实现这个自动滚动功能?
下面是我的代码,我实现了自动滚动,但滚动不平稳...(完全是Java和Android的新手..微笑)...谢谢!
Timer scrollTimer = new Timer();
Handler handler = new Handler();
ScrollView scrollView = (ScrollView) findViewById(R.id.hse);
int scrollSpeed = 5; // this is set by the user in preferences
TimerTask scrollerSchedule = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
//Here I want to increment the scrollbar's vertical position by 10
//scrollView.smoothScrollBy(0, scrollView.getScrollY() + 10);
new moveScrollView().execute();
}
});
}
};
scrollTimer.schedule(scrollerSchedule, 0, scrollSpeed * 100);
}
private class moveScrollView extends AsyncTask<Void, Void, Void> {
protected void onProgressUpdate(Void... progress) {
// show the user some sort of progress indicator
// like how many minutes before scroll is completed
}
protected Void doInBackground(Void... params) {
// TODO
int scrollPos = (int) (scrollView.getScrollY() + 10.0);
scrollView.smoothScrollTo(0, scrollPos);
return null;
}
}
变更:根据@Kurtis的建议,我增加了AsyncTask来执行滚动,并使用TimerTask + Handler进行重复。现在运行滚动代码时
int scrollPos = (int) (scrollView.getScrollY() + 10.0);
scrollView.smoothScrollTo(0, scrollPos);
在AsynTask中,我遇到了一个错误,但是当我直接在我的Runnable中运行代码时,它按预期工作。我仍然关心效率,并且真的想使用AsynTask。有没有修复AsynTask代码的提示?
顺便说一下:这是我的观察(对于像我这样的新手)。以前我使用了
scrollView.smoothScrollBy(0, scrollView.getScrollY() + 10);
当滚动开始跳跃不平稳时,它会以增量方式递增滚动值,如+5、+10、+15……而不是像+5、+5、+5……一样的均匀重复。我发现如果我想计算类似scrollView.getScrollY() + 10的增量值,则应该使用smoothScrollTo()而不是smoothScrollBy()。
scrollView.smoothScrollTo(0, scrollView.getScrollY() + 10);