Hier ist mein Code zum Deaktivieren des gesamten Bildlaufs in der Webansicht:
// disable scroll on touch
webview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return (event.getAction() == MotionEvent.ACTION_MOVE);
}
});
So blenden Sie nur die Bildlaufleisten aus, deaktivieren jedoch nicht das Scrollen:
WebView.setVerticalScrollBarEnabled(false);
WebView.setHorizontalScrollBarEnabled(false);
Sie können auch versuchen, ein einspaltiges Layout zu verwenden. Dies funktioniert jedoch nur bei einfachen Seiten und deaktiviert das horizontale Scrollen:
//Only disabled the horizontal scrolling:
webview.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
Sie können auch versuchen, Ihre Webansicht mit einer vertikal scrollenden Bildlaufansicht zu verpacken und alle Bildlaufvorgänge in der Webansicht zu deaktivieren:
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical" >
<WebView
android:id="@+id/mywebview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="none" />
</ScrollView>
Und setzen
webview.setScrollContainer(false);
Vergessen Sie nicht, den webview.setOnTouchListener(...)
obigen Code hinzuzufügen , um das Scrollen in der Webansicht zu deaktivieren. Die vertikale ScrollView ermöglicht das Scrollen des WebView-Inhalts.
MotionEvent.ACTION_MOVE
Ereignisse in Ihrem behandeln müssen,WebView
siehe meine Antwort unten.ACTION_MOVE
auf dersetOnTouchListener
Veranstaltung einige Nebenwirkungen hat , so würde ich diese Antwort nicht empfehlen; 1. Schnelle Wischvorgänge werden alsonclick
Ereignisse auf der Seite gezählt. 2. Verhindert das Überlaufen von Elementen auf der Seite. Dies kann je nach Site für eine ordnungsgemäße Interaktion erforderlich sein. 3. Das JS-touchmove
Ereignis. @GDanger hat die richtige Antwort, die das überschreibt,overScrollBy
indem es das erweitert,WebView
da es keine anderen Effekte hat, sondern nur das Scrollen von Seiten verhindert. stackoverflow.com/a/26129301/1244574Ich weiß nicht, ob Sie es noch brauchen oder nicht, aber hier ist die Lösung:
quelle
Das
WebView
Ignorieren von Bewegungsereignissen ist der falsche Weg. Was ist, wenn SieWebView
von diesen Ereignissen erfahren müssen?Unterklassen
WebView
und überschreiben Sie stattdessen die nicht privaten Bildlaufmethoden.Wenn man sich die aussehen Quelle für
WebView
können Sie sehen , dassonTouchEvent
Anrufe ,doDrag
die Anrufe overScrollBy .quelle
Durch Hinzufügen der Randdetails zum Textkörper wird das Scrollen verhindert, wenn Ihr Inhalt ordnungsgemäß umbrochen wird.
Einfach genug und viel weniger Code + Bug Overhead :)
quelle
Legen Sie einen Listener in Ihrem WebView fest:
quelle
return
Zeile. Auch dies bricht HTML5-Canvas- und JavaScript-Touch-Ereignisse.event.getAction() != MotionEvent.ACTION_MOVE
genauso gut versucht wiereturn true
return false
nichtreturn true
.Ich habe dies noch nicht versucht, da ich noch nicht auf dieses Problem gestoßen bin, aber vielleicht könnten Sie die onScroll-Funktion überschreiben?
quelle
Meine schmutzige, aber einfach zu implementierende und gut funktionierende Lösung:
Fügen Sie einfach die Webansicht in eine Bildlaufansicht ein. Stellen Sie die Webansicht so ein, dass sie viel zu groß als der mögliche Inhalt ist (in einer oder beiden Dimensionen, abhängig von den Anforderungen). ..und richten Sie die Bildlaufleiste (n) der Bildlaufansicht nach Ihren Wünschen ein.
Beispiel zum Deaktivieren der horizontalen Bildlaufleiste in einer Webansicht:
Ich hoffe das hilft ;)
quelle
Ich habe das Flimmern behoben und automatisch gescrollt durch:
Wenn es jedoch aus irgendeinem Grund immer noch nicht funktioniert, erstellen Sie einfach eine Klasse, die WebView erweitert, und fügen Sie diese Methode hinzu:
Ich schlage vor, WebView zu erweitern, um eine effektivere Steuerung wie Deaktivieren / Aktivieren von Wischen, Aktivieren / Deaktivieren von Berührungen, Listener, Steuerungsübergänge, Animationen, internes Definieren von Einstellungen usw. bereitzustellen.
quelle
Verwenden Sie diese Option, um den Bildlauf zu deaktivieren
quelle
Dies ist möglicherweise nicht die Ursache Ihres Problems, aber ich habe stundenlang versucht herauszufinden, warum meine Anwendung, die auf dem iPhone einwandfrei funktioniert hat, dazu führt, dass der Android-Browser ständig die vertikalen / horizontalen Bildlaufleisten hochwirft und die Seite tatsächlich verschiebt. Ich hatte ein HTML-Body-Tag mit einer Höhe und Breite von 100% und der Body war voller verschiedener Tags an verschiedenen Orten. Egal was ich versuchte, die Android-Browser zeigten ihre Bildlaufleisten an und bewegten die Seite nur ein wenig, besonders wenn sie schnell wischten. Die Lösung, die für mich funktionierte, ohne etwas in einer APK tun zu müssen, bestand darin, dem Body-Tag Folgendes hinzuzufügen:
Es scheint, dass die Standardränder für Body-Tags auf den Droiden angewendet, auf dem iPhone jedoch ignoriert wurden
quelle
Wenn Sie Webview unterklassifizieren , können Sie onTouchEvent einfach überschreiben, um die Verschiebungsereignisse herauszufiltern, die das Scrollen auslösen.
quelle
Das Studieren der obigen Antworten hat fast für mich funktioniert ... aber ich hatte immer noch ein Problem, dass ich die Ansicht zu 2.1 'schleudern' konnte (schien mit 2.2 & 2.3 behoben zu sein).
Hier ist meine endgültige Lösung
quelle
Dies sollte die vollständige Antwort sein. Wie von @GDanger vorgeschlagen. Erweitern Sie WebView, um die Bildlaufmethoden zu überschreiben und die benutzerdefinierte Webansicht in Layout-XML einzubetten.
Und dann wie folgt in die Layoutdatei einbetten
Verwenden Sie dann in der Aktivität einige zusätzliche Methoden zum Deaktivieren von Bildlaufleisten.
quelle
Verwenden
android:focusableInTouchMode="false"
Sie es einfach in Ihrem WebView .quelle