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

时间:2011-10-21 19:06:37

标签: android

我正在制作一个文档阅读器应用程序,我希望用户能够让应用程序自动滚动文档而不是手动滚动。请问有人可以提出如何垂直制作ScrollView“Auto-Scroll”的想法吗?在电影结束时有类似的信用。我在下面设置了一个TimerTask但我的问题是:

  1. 如何将增量值输入TimerTask,即每次运行TimerTask时滚动条应该进入的新位置。

  2. 有没有更好的方法来实现此自动滚动功能?

  3. 我的代码如下,我实现了自动滚动,但滚动甚至没有...(对于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);
    

2 个答案:

答案 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文章。