我希望在每个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属性已增加,但视图不会移动。
我的猜测是系统正在等待视图的所有更改以重绘它。有没有办法在每次迭代时更新视图,或者更好的方法来执行此操作?
注意:我没有在页面末尾检查和停止按钮,因为它们与问题无关。
答案 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