Вот мой код для отключения всей прокрутки в веб-просмотре:
webview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return (event.getAction() == MotionEvent.ACTION_MOVE);
}
});
Чтобы только скрыть полосы прокрутки, но не отключить прокрутку:
WebView.setVerticalScrollBarEnabled(false);
WebView.setHorizontalScrollBarEnabled(false);
или вы можете попробовать использовать макет с одним столбцом, но это работает только с простыми страницами и отключает горизонтальную прокрутку:
webview.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
Вы также можете попробовать обернуть свой веб-просмотр вертикальной прокруткой прокрутки и отключить всю прокрутку в веб-просмотре:
<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>
И установить
webview.setScrollContainer(false);
Не забудьте добавить приведенный webview.setOnTouchListener(...)
выше код, чтобы отключить всю прокрутку в веб-просмотре. Вертикальный ScrollView позволит прокручивать содержимое WebView.
MotionEvent.ACTION_MOVE
события в вашем,WebView
см. Мой ответ ниже.ACTION_MOVE
наsetOnTouchListener
событии имеет некоторые побочные эффекты, поэтому я бы НЕ рекомендовал этот ответ; 1. Быстрые смахивания считаютсяonclick
событиями на странице. 2. Предотвращает переполнение прокрутки элементов на странице, это может понадобиться для правильного взаимодействия в зависимости от сайта. 3.touchmove
Событие JS . @GDanger имеет правильный ответ, который отменяет,overScrollBy
расширяя,WebView
поскольку он не имеет других побочных эффектов, просто предотвращает прокрутку страницы. stackoverflow.com/a/26129301/1244574Не знаю, нужно оно вам или нет, но вот решение:
appView = (WebView) findViewById(R.id.appView); appView.setVerticalScrollBarEnabled(false); appView.setHorizontalScrollBarEnabled(false);
источник
Создание
WebView
событий игнорирования движения - неправильный способ решения этой проблемы. Что, еслиWebView
нужно услышать об этих событиях?Вместо этого подклассифицируйте
WebView
и переопределите не приватные методы прокрутки.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 } }
Если вы посмотрите на источнике для
WebView
вы можете видеть , чтоonTouchEvent
вызовы ,doDrag
которые называют overScrollBy .источник
Добавление деталей полей в тело предотвратит прокрутку, если ваш контент правильно обернут, например:
<body leftmargin="0" topmargin="0" rightmargin="0" bottommargin="0">
Достаточно просто, и намного меньше кода + накладных расходов :)
источник
Установите слушателя на свой WebView:
webView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return(event.getAction() == MotionEvent.ACTION_MOVE)); } });
источник
return
строки стоит дополнительная скобка . Также это нарушает события касания HTML5 Canvas и JavaScript.event.getAction() != MotionEvent.ACTION_MOVE
хужеreturn true
return false
нетreturn true
.Я не пробовал этого, так как я еще не сталкивался с этой проблемой, но, возможно, вы могли бы переопределить функцию onScroll?
@Override public void scrollTo(int x, int y){ super.scrollTo(0,y); }
источник
Мое грязное, но простое в реализации и хорошо работающее решение:
Просто поместите веб-просмотр внутрь прокрутки. Сделайте веб-просмотр слишком большим, чем возможный контент (в одном или обоих измерениях, в зависимости от требований). ..и настройте полосы прокрутки просмотра по своему желанию.
Пример отключения горизонтальной полосы прокрутки в веб-просмотре:
<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>
Надеюсь, это поможет ;)
источник
Я разрешил мерцание и автопрокрутку:
webView.setFocusable(false); webView.setFocusableInTouchMode(false);
Однако, если по какой-то причине он все еще не работает, просто создайте класс, расширяющий WebView, и поместите в него этот метод:
// disable scroll on touch setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return (event.getAction() == MotionEvent.ACTION_MOVE); } });
Я предлагаю расширить WebView, чтобы обеспечить более эффективный контроль, такой как отключение / включение свайпов, включение / отключение касаний, прослушивателей, управляющих переходов, анимации, определение внутренних параметров и т. Д.
источник
Чтобы отключить прокрутку, используйте это
webView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return (event.getAction() == MotionEvent.ACTION_MOVE); } });
источник
Возможно, это не является источником вашей проблемы, но я потратил часы, пытаясь отследить, почему мое приложение, которое нормально работало на iphone, заставляет браузер Android постоянно отображать вертикальные / горизонтальные полосы прокрутки и фактически перемещать страницу. У меня был тег тела html с высотой и шириной, установленной на 100%, и тело было заполнено различными тегами в разных местах. Независимо от того, что я пробовал, браузеры Android показывали свои полосы прокрутки и немного сдвигали страницу, особенно при быстром смахивании. Решение, которое сработало для меня без необходимости делать что-либо в APK, заключалось в добавлении следующего в тег body:
leftmargin="0" topmargin="0"
Кажется, что поля по умолчанию для тега body применялись к дроиду, но игнорировались на iphone
источник
Если вы создаете подкласс Webview, вы можете просто переопределить onTouchEvent, чтобы отфильтровать события перемещения, запускающие прокрутку.
public class SubWebView extends WebView { @Override public boolean onTouchEvent (MotionEvent ev) { if(ev.getAction() == MotionEvent.ACTION_MOVE) { postInvalidate(); return true; } return super.onTouchEvent(ev); } ...
источник
изучение приведенных выше ответов почти сработало для меня ... но у меня все еще была проблема, заключающаяся в том, что я мог `` бросить '' представление на 2.1 (казалось, было исправлено в 2.2 и 2.3).
вот мое окончательное решение
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); } }
источник
Это должен быть полный ответ. По предложению @GDanger. Расширьте WebView, чтобы переопределить методы прокрутки и встроить настраиваемый веб-просмотр в 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(); } } }
А затем вставьте в файл макета следующим образом
<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"/>
Затем в Activity используйте некоторые дополнительные методы для отключения полос прокрутки.
ScrollDisabledWebView webView = (ScrollDisabledWebView) findViewById(R.id.webView); webView.setVerticalScrollBarEnabled(false); webView.setHorizontalScrollBarEnabled(false);
источник
Просто используйте
android:focusableInTouchMode="false"
в своем webView .источник