使用处理程序自动滚动WebView

时间:2013-02-01 07:27:16

标签: android scroll android-webview

我希望在每个ms的特定数量的像素内给定一定数量的像素,从上到下自动滚动下载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属性已增加,但视图不会移动。

我的猜测是系统正在等待视图的所有更改以重绘它。有没有办法在每次迭代时更新视图,或者更好的方法来执行此操作?

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

2 个答案:

答案 0 :(得分:3)

我找到了答案;

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期望一个时间作为第二个参数,因为我只通过了200ms,虽然它已经晚了并且立即进行了第二次(和下一次)迭代,没有留出时间要绘制的元素。 postDelayed期望在再次执行之前等待一些ms,这使系统有时间重绘窗口并执行其他事件。

答案 1 :(得分:0)

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