[英]Android + How to add vertical “Auto-Scroll” feature to ScrollView or TextView
我正在制作一个文档阅读器应用程序,我希望用户能够让应用程序自动滚动文档而不是手动滚动。 请问有人可以提出如何垂直制作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);
这是我创建的幻灯片演示,用于显示我的某个应用的积分。 它的来源将让您了解如何继续。
您可以下载源代码并将项目导入eclipse进行试用。
您应该使用AsyncTask的组合为您进行滚动,并使用AlarmManager为您重复。 在高级别,您应该做的是创建一个广播的PendingIntent。 在您的活动中,创建一个广播接收器,接收PendingIntent将具有的广播类型。 每当接收者收到广播时,都应该启动一个AsInTask,其doInBackground方法就是:
scrollView.smoothScrollBy(0, scrollView.getScrollY() + 10);
但要小心。 确保在活动暂停时关闭使用警报管理器创建的警报(即在onPause方法中)。 如果你不这样做,你将会发射一堆永远无法使用的广播。 这将耗尽用户电池。 然后,您还应该在onResume方法中重新打开警报。
在警报管理器中设置警报时,请务必使用ELAPSED_REAL_TIME。 否则,您的滚动速率将随着设备上处理器的速度而变化。 您可以调整发送广播的时间间隔,以使视图滚动更快或更慢。
PS
有关线程的更多建议,请查看无痛线程文章。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.