繁体   English   中英

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

[英]Android + How to add vertical “Auto-Scroll” feature to ScrollView or TextView

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

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

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

我的代码在下面,我实现了自动滚动,但滚动甚至没有......(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM