我正在寻找一种方法来检测WebView是否完全缩小。我知道你可以从ZoomOut()获得一个布尔返回值,但是这将执行缩小。我只是想知道它是否可以。
答案 0 :(得分:3)
我使用自定义WebView
课程。
获取WebView
的视图高度和内部html网页的contentHeight
。
计算defaultScale = WebView.getHeight() / WebView.getContentHeight();
和currentScale = WebView.getScale()
。
如果defaultScale
< currentScale
它被放大了。
public class NoZoomControllWebView extends WebView {
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressWarnings("deprecation")
public boolean isZoomed () {
boolean result = false;
int contentHeight = getContentHeight();
int viewHeight = getHeight();
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR1 ) {
float scale = getScale();
int temp = (int)(((float)viewHeight / (float)contentHeight) * 100);
if (temp < (int)(scale * 100)) {
result = true;
}
} else {
float scale = getScale();
int temp = (int)(((float)viewHeight / (float)contentHeight) * 100);
if (temp < (int)(scale * 100)) {
result = true;
}
}
return result;
}
}
答案 1 :(得分:2)
getScaled()
已弃用,您应使用onScaleChanged
而是在你的WebViewClient上
你可以像这样使用它:
private boolean zoomed = false, firstRun = true;
@Override
public void onScaleChanged(WebView view, float oldScale,
float newScale) {
if (firstRun) {
initScale = newScale;
firstRun=false;
zoomed = false;
}
else {
if (newScale>oldScale) {
zoomed = true;
}
else {
if (newScale<initScale) {
zoomed = false;
}
}
}
super.onScaleChanged(view, oldScale, newScale);
}
如果我们假设WebView从一开始就被缩放到最大值。
答案 2 :(得分:1)
创建自己的类,扩展WebView并覆盖zoomOut()方法。每次用户缩小时,请调用super.zoomOut()。将返回的内容保存为具有类范围的布尔变量,以便可以使用onSaveInstanceState()或SharedPreferences(如果需要)保留它。
public class MyWebView extends WebView {
// WebViews are generally zoomed out all the way when first created so set defaults
private boolean lastZoomInResult = true;
private boolean lastZoomOutResult = false;
@Override
public boolean zoomIn() {
lastZoomInResult = super.zoomIn();
return lastZoomInResult;
}
@Override
public boolean zoomOut() {
lastZoomOutResult = super.zoomOut();
return lastZoomOutResult;
}
编辑:为了回应这种不适用于缩放变焦......你是完全正确的,最终克里斯蒂安的回答是正确的。
我通过USB将手机连接到带有DDMS的PC上。当我捏缩放我的Webview时,我看到以下内容......
01-06 03:18:19.052: DEBUG/SurfaceFlinger(92): Layer::setBuffers(this=0x849ac0), pid=23072, w=1, h=1
01-06 03:18:19.052: DEBUG/SurfaceFlinger(92): Layer::setBuffers(this=0x849ac0), pid=23072, w=1, h=1
01-06 03:18:19.082: DEBUG/SurfaceFlinger(92): Layer::requestBuffer(this=0x849ac0), index=0, pid=23072, w=480, h=74 success
01-06 03:18:19.832: DEBUG/SurfaceFlinger(92): Layer::setBuffers(this=0x738378), pid=23072, w=1, h=1
01-06 03:18:19.832: DEBUG/SurfaceFlinger(92): Layer::setBuffers(this=0x738378), pid=23072, w=1, h=1
01-06 03:18:19.852: DEBUG/SurfaceFlinger(92): Layer::requestBuffer(this=0x738378), index=0, pid=23072, w=480, h=74 success
简而言之,它不是缩放的WebView。实际发生的是图形显示的数字缩放 - 无论放大或缩小,WebView内容都保持完全相同的大小,但它像数码相机上的数码变焦一样被数字'放大'或'缩小'。
我不完全了解SurfaceFlinger是什么,但是通过Google快速搜索,我们在这里谈论“设备驱动程序”。
这些SurfaceFlinger日志消息中唯一发生变化的是'this ='的十六进制值,它们与缩放状态无关。以上是在屏幕完全缩小时记录两次捏合尝试。
答案 3 :(得分:1)
我很想知道其他人可能会想出什么,但我能够通过javascript实现这一目标。令人沮丧的是因为我可以看到在WebView的源代码中轻松确定这个值所需的值,但它们是私有的,没有getter ......
无论如何我到目前为止的解决方案是添加一个JavaScriptInterface,它允许我获取页面的document.body.scrollWidth值。这为我提供了可滚动的宽度,即使有getContentHeight()方法也无法使用它。使用它,我可以计算它是否完全缩小。
这是javascript接口调用的方法:
public void checkIfZoomedOut(int scrollWidth){
int zoomedOutThreshold = 5; // If you want to include "nearly zoomed out"
if( Math.abs(Math.ceil(mWebView.getScale() * scrollWidth) - mWebView.getWidth()) <= zoomedOutThreshold){
// It is zoomed out
} else {
// It is zoomed in
}
}
scrollWidth是document.body.scrollWidth
编辑:经过进一步的实验,我找到了名为computeHorizontalScrollRange()和computeHorizontalScrollExtent()的受保护方法,如果您继承WebView,则可以调用这些方法。您可以使用它们来确定水平滚动是否有效/需要。但是,某些网页可以完全缩小(WebView不会让您进一步缩小)并且仍然有一个水平滚动条,例如带有文本的网页。所以它并不完美。
答案 4 :(得分:0)
if( !webView.zoomOut () ){
// couldn't zoom out because the zoom out did nothing :(
// THIS IS WHAT YOU WANT TO KNOW!
} else{
webView.zoomIn(); // restore
}
我只是想知道它是否可以。
没有办法这样做。