Ich suche nach einer Möglichkeit festzustellen, ob ein WebView vollständig ausgezoomt ist oder nicht. Ich weiß, dass Sie einen booleschen Rückgabewert von ZoomOut() erhalten können, aber das führt den Zoom aus. Ich will einfach nur wissen, ob es geht oder nicht.So ermitteln Sie, ob ein WebView vollständig herausgezoomt ist
Antwort
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;
}
}
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.
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.
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
@littleFluffyKitty: Siehe meine Antwort unter dem Code, den ich ursprünglich gepostet habe (von dem Punkt, der mit 'EDIT:' markiert ist). – Squonk
Danke für die ausführliche Antwort. Ich habe eine grobe Art herausgefunden, wie es funktionieren kann (als Antwort geschrieben). Danke nochmal! – cottonBallPaws
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.
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 .
- 1. Ermitteln, ob ein Formular vollständig ausgeblendet ist
- 2. So ermitteln Sie, ob NSString leer ist
- 3. So ermitteln Sie, ob ein Kennwort erforderlich ist
- 4. So ermitteln Sie, ob das Laufwerk ein externes Laufwerk ist
- 5. So ermitteln Sie, ob KeyCode druckbares Zeichen ist
- 6. Ermitteln, ob ein Element ein Formularfeld ist
- 7. So ermitteln Sie, ob die Methode zur Laufzeit asynchron ist
- 8. So ermitteln Sie, ob ein Ereignis bereits abonniert wurde
- 9. So ermitteln Sie, ob ein Verzeichnispfad SUBST'd wurde
- 10. C# So ermitteln Sie, ob HTTPS
- 11. So ermitteln Sie, ob MethodInfo eine Überschreibung der Basismethode ist
- 12. So ermitteln Sie, ob eine meiner Aktivitäten im Vordergrund ist
- 13. So ermitteln Sie, ob SmartLock auf dem Gerät aktiviert ist
- 14. So ermitteln Sie, ob eine Datei unbekannter Dateityp ist C#
- 15. So ermitteln Sie, ob der Remoting-Kanal bereits registriert ist
- 16. So ermitteln Sie, ob das Benutzerkonto aktiviert oder deaktiviert ist
- 17. So ermitteln Sie, ob der Mauszeiger in einem Steuerelement ist
- 18. So ermitteln Sie, ob das Feld in AngularJS ausgewählt ist
- 19. tmux Ermitteln, ob ein Fensterbereich markiert ist
- 20. Android Webview - Löschen Sie den Cache vollständig
- 21. Ermitteln, ob ein Verzeichnis beschreibbar ist
- 22. Ermitteln, ob $ .ajax Fehler ist ein Timeout
- 23. Ermitteln, ob ein Websocket send() fertig ist
- 24. Ermitteln, ob ein Menü heruntergefallen ist
- 25. Kopfbild verkleinert sich nicht auf mobiler Safari, - bleibt vollständig herausgezoomt
- 26. Wie ermitteln Sie, ob ein XFS-Dateisystem programmgesteuert eingefroren ist?
- 27. Ermitteln Sie, ob ein Ereignis mit
- 28. Erkennen, ob Chrome Webview ist?
- 29. Ermitteln, ob WindowServer verfügbar ist?
- 30. So ermitteln Sie, warum WKWebView abstürzt
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