Aqui está o meu código para desativar toda a rolagem no webview:
webview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return (event.getAction() == MotionEvent.ACTION_MOVE);
}
});
Para ocultar apenas as barras de rolagem, mas não desativar a rolagem:
WebView.setVerticalScrollBarEnabled(false);
WebView.setHorizontalScrollBarEnabled(false);
ou você pode tentar usar o layout de coluna única, mas isso só funciona com páginas simples e desativa a rolagem horizontal:
webview.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
Você também pode tentar envolver sua visualização da web com rolagem vertical de rolagem e desativar toda a rolagem na visualização da 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>
E definir
webview.setScrollContainer(false);
Não se esqueça de adicionar o webview.setOnTouchListener(...)
código acima para desativar toda a rolagem na visualização da web. O ScrollView vertical permitirá a rolagem do conteúdo do WebView.
MotionEvent.ACTION_MOVE
eventos em seu,WebView
veja minha resposta abaixo.ACTION_MOVE
nosetOnTouchListener
evento tem alguns efeitos colaterais, então eu NÃO recomendaria esta resposta; 1. Deslizamentos rápidos são contados comoonclick
eventos na página. 2. Evita o estouro de rolagem de elementos na página, isso pode ser necessário para uma interação adequada, dependendo do site. 3. Otouchmove
evento JS . @GDanger tem a resposta correta que está substituindo ooverScrollBy
estendendo o,WebView
pois não tem efeitos colaterais, apenas evita a rolagem da página. stackoverflow.com/a/26129301/1244574Não sei se ainda precisa ou não, mas aqui está a solução:
appView = (WebView) findViewById(R.id.appView); appView.setVerticalScrollBarEnabled(false); appView.setHorizontalScrollBarEnabled(false);
fonte
Fazer
WebView
ignorar eventos de movimento é a maneira errada de fazer isso. E seWebView
precisar ouvir sobre esses eventos?Em vez disso, crie uma subclasse
WebView
e substitua os métodos de rolagem não 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 } }
Se você olhar para a fonte para
WebView
que você pode ver que asonTouchEvent
chamadasdoDrag
que chama overScrollBy .fonte
Adicionar os detalhes da margem ao corpo impedirá a rolagem se o conteúdo for agrupado corretamente, da seguinte forma:
<body leftmargin="0" topmargin="0" rightmargin="0" bottommargin="0">
Fácil, e muito menos código + sobrecarga de bug :)
fonte
Defina um ouvinte em seu WebView:
webView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return(event.getAction() == MotionEvent.ACTION_MOVE)); } });
fonte
return
linha. Além disso, isso quebra a tela HTML5 e os eventos de toque do JavaScript.event.getAction() != MotionEvent.ACTION_MOVE
tão bem quantoreturn true
return false
nãoreturn true
.Não tentei fazer isso porque ainda não encontrei esse problema, mas talvez você possa sobrescrever a função onScroll?
@Override public void scrollTo(int x, int y){ super.scrollTo(0,y); }
fonte
Minha solução suja, mas fácil de implementar e que funciona bem:
Basta colocar o webview dentro de um scrollview. Faça com que a webview seja muito maior do que o conteúdo possível (em uma ou ambas as dimensões, dependendo dos requisitos). ..e configure a (s) barra (s) de rolagem da visualização de rolagem como desejar.
Exemplo para desativar a barra de rolagem horizontal em uma visualização da 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>
Eu espero que isso ajude ;)
fonte
Resolvi a tremulação e a rolagem automática:
webView.setFocusable(false); webView.setFocusableInTouchMode(false);
No entanto, se por algum motivo ainda não funcionar, basta fazer uma classe que estenda WebView e colocar este método nela:
// disable scroll on touch setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return (event.getAction() == MotionEvent.ACTION_MOVE); } });
Estou sugerindo estender o WebView, a fim de fornecer um controle mais eficaz, como desabilitar / habilitar deslizamentos, habilitar / desabilitar toques, ouvintes, controlar transições, animações, definir configurações internamente e assim por diante.
fonte
Para desativar a rolagem, use este
webView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return (event.getAction() == MotionEvent.ACTION_MOVE); } });
fonte
Esta pode não ser a origem do seu problema, mas passei horas tentando rastrear por que meu aplicativo funcionou bem no iphone faz com que o navegador Android erga constantemente as barras de rolagem vertical / horizontal e realmente mova a página. Eu tinha uma tag de corpo html com altura e largura definidas em 100%, e o corpo estava cheio de várias tags em locais diferentes. Não importava o que eu tentasse, os navegadores Android mostravam suas barras de rolagem e moviam a página um pouco, principalmente ao deslizar rapidamente. A solução que funcionou para mim sem ter que fazer nada em um APK foi adicionar o seguinte à tag do corpo:
leftmargin="0" topmargin="0"
Parece que as margens padrão para a etiqueta do corpo foram aplicadas no droid, mas ignoradas no iphone
fonte
Se você criar uma subclasse de Webview, poderá simplesmente substituir onTouchEvent para filtrar os eventos de movimentação que acionam a rolagem.
public class SubWebView extends WebView { @Override public boolean onTouchEvent (MotionEvent ev) { if(ev.getAction() == MotionEvent.ACTION_MOVE) { postInvalidate(); return true; } return super.onTouchEvent(ev); } ...
fonte
estudar as respostas acima quase funcionou para mim ... mas eu ainda tinha o problema de poder 'lançar' a visão no 2.1 (parecia estar corrigido no 2.2 e 2.3).
aqui está minha solução 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); } }
fonte
Esta deve ser a resposta completa. Conforme sugerido por @GDanger. Estenda o WebView para substituir os métodos de rolagem e incorporar o WebView personalizado no XML de layout.
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(); } } }
E, em seguida, incorpore no arquivo de layout da seguinte forma
<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"/>
Em seguida, na Atividade, use alguns métodos adicionais para desativar as barras de rolagem também.
ScrollDisabledWebView webView = (ScrollDisabledWebView) findViewById(R.id.webView); webView.setVerticalScrollBarEnabled(false); webView.setHorizontalScrollBarEnabled(false);
fonte
Basta usar
android:focusableInTouchMode="false"
no seu webView .fonte