Aquí está mi código para deshabilitar todo el desplazamiento en la vista web:
webview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return (event.getAction() == MotionEvent.ACTION_MOVE);
}
});
Para ocultar solo las barras de desplazamiento, pero no deshabilitar el desplazamiento:
WebView.setVerticalScrollBarEnabled(false);
WebView.setHorizontalScrollBarEnabled(false);
o puede intentar usar el diseño de una sola columna, pero esto solo funciona con páginas simples y deshabilita el desplazamiento horizontal:
webview.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
También puede intentar ajustar su vista web con la vista de desplazamiento de desplazamiento vertical y deshabilitar todo el desplazamiento en la vista web:
<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>
Y establecer
webview.setScrollContainer(false);
No olvide agregar el webview.setOnTouchListener(...)
código anterior para deshabilitar todo el desplazamiento en la vista web. El ScrollView vertical permitirá el desplazamiento del contenido de WebView.
MotionEvent.ACTION_MOVE
eventos en su,WebView
vea mi respuesta a continuación.ACTION_MOVE
en elsetOnTouchListener
evento tiene algunos efectos secundarios, así que no recomendaría esta respuesta; 1. Los deslizamientos rápidos se cuentan comoonclick
eventos en la página. 2. Evita el desplazamiento desbordado de elementos en la página, esto podría ser necesario para una interacción adecuada según el sitio. 3. Eltouchmove
evento JS . @GDanger tiene la respuesta correcta, que anulaoverScrollBy
al extender el,WebView
ya que no tiene efectos en el otro lado, solo evita el desplazamiento de la página. stackoverflow.com/a/26129301/1244574No sé si todavía lo necesita o no, pero aquí está la solución:
appView = (WebView) findViewById(R.id.appView); appView.setVerticalScrollBarEnabled(false); appView.setHorizontalScrollBarEnabled(false);
fuente
Hacer los
WebView
eventos de movimiento de ignorar es la forma incorrecta de hacerlo. ¿Qué pasa siWebView
necesita escuchar sobre estos eventos?En su lugar, subclase
WebView
y anule los métodos de desplazamiento no privados.public class NoScrollWebView extends WebView { ... @Override public boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { return false; } @Override public void scrollTo(int x, int y) { // Do nothing } @Override public void computeScroll() { // Do nothing } }
Si nos fijamos en la fuente para
WebView
que pueda ver que lasonTouchEvent
llamadasdoDrag
que se pide overScrollBy .fuente
Agregar los detalles de los márgenes al cuerpo evitará el desplazamiento si su contenido se ajusta correctamente, así:
<body leftmargin="0" topmargin="0" rightmargin="0" bottommargin="0">
Bastante fácil, y mucho menos código + error de sobrecarga :)
fuente
Configure un oyente en su WebView:
webView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return(event.getAction() == MotionEvent.ACTION_MOVE)); } });
fuente
return
línea. Además, esto rompe el lienzo HTML5 y los eventos táctiles de JavaScript.event.getAction() != MotionEvent.ACTION_MOVE
tan bien comoreturn true
return false
, noreturn true
.No he probado esto porque todavía no he encontrado este problema, pero ¿quizás podrías anular la función onScroll?
@Override public void scrollTo(int x, int y){ super.scrollTo(0,y); }
fuente
Mi solución sucia, pero fácil de implementar y que funciona bien:
Simplemente coloque la vista web dentro de una vista de desplazamiento. Haga que la vista web sea mucho más grande que el contenido posible (en una o ambas dimensiones, según los requisitos). ..y configure las barras de desplazamiento de scrollview como desee.
Ejemplo para deshabilitar la barra de desplazamiento horizontal en una vista web:
<ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" android:scrollbars="vertical" > <WebView android:id="@+id/mywebview" android:layout_width="1000dip" android:layout_height="fill_parent" /> </ScrollView>
Espero que esto ayude ;)
fuente
Resolví el parpadeo y el desplazamiento automático por:
webView.setFocusable(false); webView.setFocusableInTouchMode(false);
Sin embargo, si todavía no funciona por alguna razón, simplemente cree una clase que amplíe WebView y coloque este método en ella:
// disable scroll on touch setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return (event.getAction() == MotionEvent.ACTION_MOVE); } });
Estoy sugiriendo extender WebView, para proporcionar un control más efectivo, como deshabilitar / habilitar deslizamientos, habilitar / deshabilitar toques, oyentes, controlar transiciones, animaciones, definir configuraciones internamente, etc.
fuente
Para deshabilitar el desplazamiento usa esto
webView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return (event.getAction() == MotionEvent.ACTION_MOVE); } });
fuente
Puede que esta no sea la fuente de su problema, pero he pasado horas tratando de rastrear por qué mi aplicación que funcionó bien en el iPhone hace que el navegador de Android muestre constantemente las barras de desplazamiento verticales / horizontales y mueva la página. Tenía una etiqueta de cuerpo html con alto y ancho establecidos al 100%, y el cuerpo estaba lleno de varias etiquetas en diferentes ubicaciones. No importa lo que intente, los navegadores de Android mostrarían sus barras de desplazamiento y moverían la página solo un poco, especialmente al hacer un deslizamiento rápido. La solución que funcionó para mí sin tener que hacer nada en un APK fue agregar lo siguiente a la etiqueta del cuerpo:
leftmargin="0" topmargin="0"
Parece que los márgenes predeterminados para la etiqueta del cuerpo se aplicaron en el droide pero se ignoraron en el iphone
fuente
Si crea una subclase de Webview, simplemente puede anular onTouchEvent para filtrar los eventos de movimiento que desencadenan el desplazamiento.
public class SubWebView extends WebView { @Override public boolean onTouchEvent (MotionEvent ev) { if(ev.getAction() == MotionEvent.ACTION_MOVE) { postInvalidate(); return true; } return super.onTouchEvent(ev); } ...
fuente
estudiar las respuestas anteriores casi funcionó para mí ... pero todavía tenía el problema de que podía 'lanzar' la vista en 2.1 (parecía estar solucionado con 2.2 y 2.3).
aquí está mi solución final
public class MyWebView extends WebView { private boolean bAllowScroll = true; @SuppressWarnings("unused") // it is used, just java is dumb private long downtime; public MyWebView(Context context, AttributeSet attrs) { super(context, attrs); } public void setAllowScroll(int allowScroll) { bAllowScroll = allowScroll!=0; if (!bAllowScroll) super.scrollTo(0,0); setHorizontalScrollBarEnabled(bAllowScroll); setVerticalScrollBarEnabled(bAllowScroll); } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: if (!bAllowScroll) downtime = ev.getEventTime(); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: if (!bAllowScroll) { try { Field fmNumSamples = ev.getClass().getDeclaredField("mNumSamples"); fmNumSamples.setAccessible(true); Field fmTimeSamples = ev.getClass().getDeclaredField("mTimeSamples"); fmTimeSamples.setAccessible(true); long newTimeSamples[] = new long[fmNumSamples.getInt(ev)]; newTimeSamples[0] = ev.getEventTime()+250; fmTimeSamples.set(ev,newTimeSamples); } catch (Exception e) { e.printStackTrace(); } } break; } return super.onTouchEvent(ev); } @Override public void flingScroll(int vx, int vy) { if (bAllowScroll) super.flingScroll(vx,vy); } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { if (bAllowScroll) super.onScrollChanged(l, t, oldl, oldt); else if (l!=0 || t!=0) super.scrollTo(0,0); } @Override public void scrollTo(int x, int y) { if (bAllowScroll) super.scrollTo(x,y); } @Override public void scrollBy(int x, int y) { if (bAllowScroll) super.scrollBy(x,y); } }
fuente
Esta debería ser la respuesta completa. Como lo sugiere @GDanger. Extienda WebView para anular los métodos de desplazamiento e incrustar la vista web personalizada en el formato XML.
public class ScrollDisabledWebView extends WebView { private boolean scrollEnabled = false; public ScrollDisabledWebView(Context context) { super(context); initView(context); } public ScrollDisabledWebView(Context context, AttributeSet attributeSet) { super(context, attributeSet); initView(context); } // this is important. Otherwise it throws Binary Inflate Exception. private void initView(Context context) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { if (scrollEnabled) { return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); } return false; } @Override public void scrollTo(int x, int y) { if (scrollEnabled) { super.scrollTo(x, y); } } @Override public void computeScroll() { if (scrollEnabled) { super.computeScroll(); } } }
Y luego incrustar en el archivo de diseño de la siguiente manera
<com.sample.apps.ScrollDisabledWebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" tools:context="com.sample.apps.HomeActivity"/>
Luego, en la Actividad, use algunos métodos adicionales para deshabilitar también las barras de desplazamiento.
ScrollDisabledWebView webView = (ScrollDisabledWebView) findViewById(R.id.webView); webView.setVerticalScrollBarEnabled(false); webView.setHorizontalScrollBarEnabled(false);
fuente
Solo utilícelo
android:focusableInTouchMode="false"
en su webView .fuente