我希望能够通过webview缩放到给定的zoomfactor,并滚动到特定的坐标。
由于我们的目标是API 19,因此我们无法使用zoomBy()(在APi 21中引入),并且必须尝试近似缩放。
已经完成并且正在工作。至少在理论上。
以下是代码:
private void zoomWebview(int x, int y, int width, int height){
int webviewWidth = mainWebview.getWidth();
int webviewHeight = mainWebview.getHeight();
float scaleX = (float)webviewWidth / width;
float scaleY = (float)webviewHeight / height;
final float scale;
System.out.println("Scale X: "+scaleX);
System.out.println("Scale Y: "+scaleY);
if(scaleX < scaleY){
scale = scaleX;
}else{
scale = scaleY;
}
System.out.println("Needed scale: "+scale);
final int transX = x;
final int transY = y;
runOnUiThread(new Runnable() {
@Override
public void run() {
float prevZoomFactor = mainWebview.getScale();
if(mainWebview.getScale() > scale){
do{
mainWebview.zoomOut();
System.out.println("Zoom out from "+prevZoomFactor+" to "+mainWebview.getScale());
if(prevZoomFactor == mainWebview.getScale()){
//In case zoomOut() wasn't able to actually zoom, break to prevent infinite loop
break;
}
prevZoomFactor = mainWebview.getScale();
}while(mainWebview.getScale() > scale);
}else{
do{
mainWebview.zoomIn();
System.out.println("Zoom in from "+prevZoomFactor+" "+mainWebview.getScale());
if(prevZoomFactor == mainWebview.getScale()){
//In case zoomIn() wasn't able to actually zoom, break to prevent infinite loop
break;
}
prevZoomFactor = mainWebview.getScale();
}while(mainWebview.getScale() < scale);
//Make sure we do not cut off any content. Rather show a little border
mainWebview.zoomOut();
}
System.out.println("Final zoom: "+mainWebview.getScale());
mainWebview.scrollTo(Math.round(transX*mainWebview.getScale()), Math.round(transY*mainWebview.getScale()));
System.out.println("Scroll to "+Math.round(transX*mainWebview.getScale())+"|"+Math.round(transY*mainWebview.getScale()));
}
});
}
最有趣的部分是应该在主线程上运行的部分。有时webview功能正在运行,有时则不然。
我可以通过buttonclick调用此函数。我连续按了4次按钮。前3次没有任何事情发生,但是在第4次,它突然起作用。
这是可重现的,并不总是经过一定的点击后,但它肯定会在某些时候起作用。
这是控制台输出:
07-23 08:09:46.304: I/System.out(25659): Scale X: 1.8285714
07-23 08:09:46.304: I/System.out(25659): Scale Y: 2.371191
07-23 08:09:46.304: I/System.out(25659): Needed scale: 1.8285714
07-23 08:09:46.304: I/System.out(25659): Zoom in from 1.6790987 1.6790987
07-23 08:09:46.304: I/System.out(25659): Final zoom: 1.6790987
07-23 08:09:46.305: I/System.out(25659): Scroll to 49|12
07-23 08:09:47.117: I/System.out(25659): Scale X: 1.8285714
07-23 08:09:47.117: I/System.out(25659): Scale Y: 2.371191
07-23 08:09:47.117: I/System.out(25659): Needed scale: 1.8285714
07-23 08:09:47.120: I/System.out(25659): Zoom in from 1.6790987 1.6790987
07-23 08:09:47.121: I/System.out(25659): Final zoom: 1.6790987
07-23 08:09:47.121: I/System.out(25659): Scroll to 49|12
07-23 08:09:47.749: I/System.out(25659): Scale X: 1.8285714
07-23 08:09:47.749: I/System.out(25659): Scale Y: 2.371191
07-23 08:09:47.749: I/System.out(25659): Needed scale: 1.8285714
07-23 08:09:47.751: I/System.out(25659): Zoom in from 1.6790987 1.6790987
07-23 08:09:47.751: I/System.out(25659): Final zoom: 1.6790987
07-23 08:09:47.752: I/System.out(25659): Scroll to 49|12
07-23 08:09:48.298: I/System.out(25659): Scale X: 1.8285714
07-23 08:09:48.298: I/System.out(25659): Scale Y: 2.371191
07-23 08:09:48.298: I/System.out(25659): Needed scale: 1.8285714
07-23 08:09:48.314: I/System.out(25659): Zoom in from 1.6790987 2.0988734
07-23 08:09:48.314: I/System.out(25659): Final zoom: 1.6790987
07-23 08:09:48.314: I/System.out(25659): Scroll to 49|12
最后6个条目描述了它突然发生的事件。注意webview突然能够从1.67缩放到2.09。还有scrollTo函数,虽然调用了相同的值。
非常感谢任何帮助。
答案 0 :(得分:0)
问题是由mainWebview.getScale()
的调用(已弃用)引起的。
解决方案是使用自定义WebViewController
,我在其中实现onScaleChanged-Listener
以获取我的网络视图的当前比例。
为了将我的缩放功能与我的听众同步,我使用了CountDownLatch
。