我正在制作一个文档阅读器应用程序,我希望用户能够让应用程序自动滚动文档而不是手动滚动。请问有人可以提出如何垂直制作ScrollView“Auto-Scroll”的想法吗?在电影结束时有类似的信用。我在下面设置了一个TimerTask但我的问题是:
如何将增量值输入TimerTask,即每次运行TimerTask时滚动条应该进入的新位置。
有没有更好的方法来实现此自动滚动功能?
我的代码如下,我实现了自动滚动,但滚动甚至没有...(对于Java和Android..smile都是全新的)...谢谢!!!
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。有关修复AsyncTask代码的任何提示吗?
scrollView.smoothScrollBy(0, scrollView.getScrollY() + 10);
并且滚动开始跳得不均匀,有点像滚动值增加+5,+ 10 + 15 + ....而不是像+ 5,+ 5,+ 5这样的偶数重复....我找到了什么如果我想像scrollView.getScrollY()+ 10那样计算增量值,那么我应该使用smoothScrollTo()而不是smoothScrollBy()。
scrollView.smoothScrollTo(0, scrollView.getScrollY() + 10);
答案 0 :(得分:8)
这是我创建的Slideshow演示,用于显示我的某个应用的积分。它的来源将让您了解如何继续。
您可以下载源代码并将项目导入eclipse进行试用。
答案 1 :(得分:0)
您应该使用AsyncTask的组合为您滚动,AlarmManager为您重复滚动。在高级别,您应该做的是创建一个广播的PendingIntent。在您的活动中,创建一个广播接收器,接收PendingIntent将具有的广播类型。每当接收者收到广播时,都应该启动一个doInBackground方法只是的AsynTask:
scrollView.smoothScrollBy(0, scrollView.getScrollY() + 10);
但要小心。确保在活动暂停时(即在onPause方法中)关闭使用警报管理器创建的警报。如果你不这样做,你将会发射一堆永远无法使用的广播。这将耗尽用户电池。然后,您还应该在onResume方法中重新打开警报。
其他一些注意事项,请确保在警报管理器中设置警报时使用ELAPSED_REAL_TIME。否则,您的滚动速率将随着设备上处理器的速度而变化。您可以调整发送广播的时间间隔,以使视图滚动更快或更慢。
P.S。
有关线程的更多建议,请查看Painless Threading文章。