Android + 如何为ScrollView或TextView添加垂直“自动滚动”功能

3
我正在开发一个文档阅读器应用,希望用户能够请求应用自动滚动文档,而不是手动滚动。请问有什么想法可以使ScrollView实现垂直“自动滚动”,就像电影结尾的字幕一样。我设置了一个TimerTask,但我的问题是:
  1. 如何获取增量值以将其提供给TimerTask,即每次运行TimerTask时应该到达的新位置。

  2. 是否有更好的方法来实现这个自动滚动功能?

下面是我的代码,我实现了自动滚动,但滚动不平稳...(完全是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);
2个回答

8
这是我创建的一个幻灯片演示 Slideshow,用于展示我的一款应用的信誉。它的源代码可以让您了解如何进行操作。
您可以下载源代码并将项目导入到Eclipse中以尝试它。

0

你应该使用AsyncTask的组合来为你滚动,使用AlarmManager的组合来重复执行。在高层次上,你应该创建一个PendingIntent作为广播。在你的活动中创建一个广播接收器,接收PendingIntent将要发送的广播类型。每当接收器接收到广播时,它应该启动一个AsynTask,其doInBackground方法只是:

scrollView.smoothScrollBy(0, scrollView.getScrollY() + 10);

但是要小心。确保在活动暂停时(即在onPause方法中)关闭使用Alarm Manager创建的闹钟。如果不这样做,您将会触发一堆从未被使用的广播。这将耗尽用户的电池电量。您还应该在onResume方法中重新打开闹钟。

其他一些注意事项,请确保在闹钟管理器中设置闹钟时使用ELAPSED_REAL_TIME。否则,您的滚动速率将随设备上处理器的速度而变化。您可以调整发送广播的时间间隔,以使视图滚动更快或更慢。

P.S.

有关线程的更多建议,请查看Painless Threading文章。


好的Kurtis,请你给我一些代码指南吗?我对Java和Android编程完全是新手...大概才5天...哈哈。 - Tochie
好的,刚看到你的链接。我会查一下然后回复你。谢谢! - Tochie
我给你的AsynTask文档链接中有很多关于如何使用它们的内容。你试过了吗? - Kurtis Nusbaum
嗨Kurtis,看到了你的链接,谢谢。从我的理解来看,我的第二个问题(明智地使用设备资源)已经得到解决,但是如何应用AsynTask来实现自动滚动? - Tochie
1
谢谢@Kurtis,我明白了。从AlarmManager的文档中,我发现了这个:“注意:Alarm Manager旨在用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行。对于正常的定时操作(滴答声、超时等),使用Handler更容易和更有效率。” 这意味着它不适用于我的情况。我会尝试AsynTask + Handler,看看我能得到什么。马上回来! - Tochie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接