【问题标题】:Android + How to add vertical "Auto-Scroll" feature to ScrollView or TextViewAndroid + 如何向 ScrollView 或 TextView 添加垂直“自动滚动”功能
【发布时间】:2011-10-22 14:35:11
【问题描述】:

我正在制作一个文档阅读器应用程序,我希望用户能够要求该应用程序自动滚动文档而不是手动滚动。请任何人都可以给我关于如何垂直制作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。关于修复我的 AsyncTask 代码的任何提示?


顺便说一句:这是我的观察(对于像我这样的新手)。以前我用过

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

并且滚动开始不均匀地跳跃,增加滚动值就像 +5, +10 +15 +.... 而不是像 +5, +5, +5.... 这样的均匀重复如果我想计算像 scrollView.getScrollY() + 10 这样的增量值,那么我应该使用 smoothScrollTo() 而不是 smoothScrollBy()。

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

【问题讨论】:

    标签: android


    【解决方案1】:

    这是我创建的 Slideshow 演示,用于展示我的一个应用程序的制作人员。它的来源会让你知道如何进行。

    你可以下载源码,将项目导入eclipse试试看。

    【讨论】:

      【解决方案2】:

      您应该使用AsyncTask 的组合为您进行滚动,并使用AlarmManager 为您进行重复。在高层次上,您应该做的是创建一个广播的 PendingIntent。在您的活动中创建一个接收 PendingIntent 将具有的广播类型的广播接收器。每次接收者收到广播时,都应该启动一个 AsynTask,其 doInBackground 方法只是:

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

      不过要小心。当您的活动暂停时(即在 onPause 方法中),请务必关闭您使用警报管理器创建的警报。如果你不这样做,你将发射一堆永远不会被使用的广播。这将耗尽用户的电池。然后,您还应该在 onResume 方法中重新打开警报。

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

      附言

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

      【讨论】:

      • 好的,Kurtis,你能给我一些代码指南吗?我对 Java 和 Android 编程完全陌生......大约 5 天大......哈哈。
      • 好的,刚刚看到你的链接。我会查找它们并返回。谢谢!
      • 我为 AsynTask 提供给你的文档链接有很多关于如何使用它们的内容。你试过了吗?
      • 嗨,Kurtis,看到你的链接,谢谢。据我了解,我的第二个问题(设备资源的明智使用)已经解决,但是如何应用 AsynTask 来实现自动滚动?
      • 谢谢@Kurtis,我明白了。从关于 AlarmManager 的文档中我发现:“注意:Alarm Manager 适用于您希望应用程序代码在特定时间运行的情况,即使您的应用程序当前没有运行。对于正常的计时操作(滴答声、超时等)使用 Handler 更容易、更高效。” 这意味着它不适用于我的情况。我会试试 AsynTask + Handler 看看我得到了什么。 brb!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 2013-05-18
      • 2013-08-13
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 2021-09-04
      相关资源
      最近更新 更多