【问题标题】:Auto-scrolling a WebView with handlers使用处理程序自动滚动 WebView
【发布时间】:2013-02-04 12:17:30
【问题描述】:

在给定每特定毫秒数的特定像素数的情况下,我想从上到下自动向下滚动加载到 WebView 中的页面。 我见过这个线程:+Android Webview - how to autoscroll a page?,但是在很多其他线程上,他们说使用 Timer 是个坏主意,所以我使用 this tutorial 处理程序:来创建我的处理程序。现在我的代码如下所示:

private Handler mHandler=new Handler();

private Runnable mScrollDown = new Runnable()
{
    public void run()
    {
        WebView webview = (WebView)findViewById(R.id.web_url);
        webview.scrollBy(0, scrollSpeed);
        mHandler.postAtTime(this, 200);
    }
};

如果我只调用一次,(删除再次调用它的最后一行)它会起作用,它会下降然后停止。但是,如果我尝试使用此代码使其逐渐向下滚动,则视图似乎不会失效(或者它会失效但未重绘)。通过调试器我可以看到 WebView 的 mScrollY 属性增加了,但是视图没有移动。

我的猜测是系统正在等待视图的所有更改以重绘它。有什么方法可以在每次迭代时更新视图,或者有更好的方法吗?

注意:我没有在其中放置页尾检查和停止按钮,因为它们与问题无关。

【问题讨论】:

    标签: android scroll android-webview


    【解决方案1】:

    我找到了答案;

    private Runnable mScrollDown = new Runnable()
    {
        public void run()
        {
            WebView webview = (WebView)findViewById(R.id.web_url);
            webview.scrollBy(0, scrollSpeed);
            mHandler.postDelayed(this, 200);
        }
    };
    

    使用 postDelayed 而不是 postAtTime 修复了它。 虽然 postAtTime(runnable,0) 用于启动循环,但 postAtTime 期望时间作为第二个参数,因为我只通过了 200 毫秒,虽然它已经晚了,但它立即进行了第二次(和下一次)迭代,没有时间要绘制的元素。 postDelayed 预计在再次执行之前等待若干毫秒,这使系统有时间重绘窗口并执行其他事件。

    【讨论】:

    • 如何停止滚动?
    【解决方案2】:
    ScrollView scroll = (ScrollView) findViewById(R.id.scroll);
    scroll.scrollTo(0, webview .getTop());//if want to go on top
    scroll.scrollTo(0, webview .getBottom());//if want to go on top
    

    【讨论】:

    • 我不确定你是否读过我的问题......这是一个 web 视图而不是一个滚动视图,我希望事情以不同的可控量向下滚动,慢慢地,而不是立即。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2013-02-22
    • 1970-01-01
    相关资源
    最近更新 更多