2011-01-06 17 views

Antwort

3

Ich benutze meine benutzerdefinierte WebView Klasse.

Get WebView 's Ansicht Höhe und innere HTML-Webseite contentHeight.

Berechnen defaultScale = WebView.getHeight()/WebView.getContentHeight(); und currentScale = WebView.getScale().

Wenn defaultScale < currentScale ist es gezoomt.

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; 
    } 
} 
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 
} 

Ich will einfach nur, ob oder nicht wissen, es kann.

Es gibt keine Möglichkeit, dies zu tun.

+0

Wenn das der einzige Weg ist, es zu tun, gibt es eine Möglichkeit, um es sofort (nicht animiert) passieren, so dass es nicht zu verkleinern und in den Benutzer hineinzoomen scheint? – cottonBallPaws

1

Erstellen Sie eine eigene Klasse, die WebView erweitert und die zoomOut() -Methode überschreibt. Jedes Mal, wenn der Benutzer zoomt, rufen Sie super.zoomOut() auf. Speichern Sie, was an eine boolesche Variable mit dem Klassenbereich zurückgegeben wird, damit sie bei Bedarf mit onSaveInstanceState() oder SharedPreferences beibehalten werden kann.

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; 
    } 

EDIT: Als Antwort auf diese für Pinch-Zoom funktioniert nicht ... sind Sie ganz richtig und letztlich Cristian Antwort gilt.

Ich hakte mein Handy über USB an meinen PC mit DDMS. Ich sehe die folgende, wenn ich meine Webview kneifen vergrößern ...

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 

Kurz gesagt, ist es nicht WebView ist das Zoomen wird. Was eigentlich passiert, ist ein digitaler Zoom des Grafikdisplays - der WebView-Inhalt bleibt unabhängig von einer Vergrößerung oder Verkleinerung exakt gleich groß, wird aber wie der digitale Zoom einer Digitalkamera digital "vergrößert" oder "geschrumpft".

Ich verstehe nicht ganz, was SurfaceFlinger ist, aber von einer schnellen Google-Suche, wir reden 'Gerätetreiber' Zeug hier.

Die einzige Sache, die sich in diesen SurfaceFlinger-Protokollnachrichten ändert, ist der Hexadezimalwert für 'this =' und sie haben keine Relevanz für den Zoomstatus. Das obige Protokoll protokolliert zwei Pinch-Versuche, wenn der Bildschirm vollständig herausgezoomt wurde.

+0

Das ist eine ziemlich gute Idee, aber diese Methoden werden nur aufgerufen, wenn ein Benutzer eine Zoom-In und Zoom-Out-Taste drückt. Sie werden nicht aufgerufen, wenn sie zoomen. – cottonBallPaws

+0

@littleFluffyKitty: Siehe meine Antwort unter dem Code, den ich ursprünglich gepostet habe (von dem Punkt, der mit 'EDIT:' markiert ist). – Squonk

+0

Danke für die ausführliche Antwort. Ich habe eine grobe Art herausgefunden, wie es funktionieren kann (als Antwort geschrieben). Danke nochmal! – cottonBallPaws

1

Ich bin neugierig zu sehen, was sonst noch jemand kommen könnte, aber ich konnte dies durch Javascript erreichen. Es ist frustrierend, weil ich die Werte sehen müssen leicht dies in dem Code der WebView Quelle bestimmt, sondern sie ohne Getter sind privat ...

Wie auch immer die Lösung, die ich bisher habe, ist einen JavaScriptInterface hinzufügen, die mir erlaubt, zu erhalten der document.body.scrollWidth-Wert für die Seite. Dies liefert mir die scrollbare Breite, die aus irgendeinem Grund nicht verfügbar ist, obwohl es eine getContentHeight() -Methode gibt. Mit dieser kann ich berechnen, ob es vollständig ausgezoomt ist oder nicht. Hier

ist die Methode, die Javascript-Schnittstelle ruft:

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 
    } 

}

Die scrollWidth ist document.body.scrollWidth

Edit: Nach weiteren Experimentieren fand ich geschützten Methoden genannt computeHorizontalScrollRange() und computeHorizontalScrollExtent(), die aufgerufen werden können, wenn Sie das WebView ableiten. Sie können mit ihnen bestimmen, ob das horizontale Scrollen aktiv/erforderlich ist.Einige Webseiten können jedoch vollständig herausgezoomt werden (das WebView lässt Sie nicht weiter herauszoomen) und haben immer noch eine horizontale Bildlaufleiste, z. B. Webseiten mit Text. Also ist es nicht perfekt.

2

getScaled() ist veraltet Sie onScaleChanged auf WebViewClient statt

Sie können es wie folgt verwenden verwenden sollte: von Anfang an

  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); 
      } 

wenn wir davon ausgehen, die WebView gezoomt max out .

Verwandte Themen