2

我想从上到下自动向下滚动加载在 WebView 中的页面,给定每一定数量的 ms 一定数量的像素。我看过这个帖子:+Android Webview - 如何自动滚动页面?但是在许多其他线程上,他们说为此使用 Timer 是一个坏主意,因此我将本教程用于处理程序:创建我的处理程序。现在我的代码如下所示:

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 属性增加了,但视图没有移动。

我的猜测是系统正在等待视图的所有更改以重绘它。有没有办法在每次迭代时更新视图,或者有更好的方法来做到这一点?

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

4

2 回答 2

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

于 2013-02-04T04:17:30.567 回答
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
于 2013-02-01T07:45:32.177 回答