Прокрутка веб-просмотра по горизонтали внутри ViewPager - PullRequest
26 голосов
/ 15 октября 2011

Я поместил WebView, загружающий изображение в ViewPager.Когда я пытаюсь прокрутить изображение по горизонтали, я перехожу к следующему виду вместо прокрутки изображения.

Можно ли сделать так, чтобы он прокручивался до конца изображения, прежде чем перейти к следующему виду?

@Override
public Object instantiateItem(View view, int i) {

    WebView webview = new WebView(view.getContext());
    webview.setHorizontalScrollBarEnabled(true);
    webview.loadUrl("http://www.site.with.an/image.gif");
    ((ViewPager) view).addView(webview, 0);

    return webview;
}

Ответы [ 2 ]

41 голосов
/ 29 марта 2012

Ниже приведено реальное рабочее решение, которое будет прокручивать WebView по горизонтали, пока оно может прокручиваться. Если WebView не может продолжить прокрутку, следующий горизонтальный удар будет использован ViewPager для переключения страницы.

Расширение WebView

В API-уровне 14 (ICS) был введен метод View canScrollHorizontally(), который нам необходим для решения проблемы. Если вы разрабатываете только для ICS или выше, вы можете напрямую использовать этот метод и перейти к следующему разделу. В противном случае нам нужно реализовать этот метод самостоятельно, чтобы решение работало и на pre-ICS.

Для этого просто выведите свой собственный класс из WebView:

public class ExtendedWebView extends WebView {
    public ExtendedWebView(Context context) {
        super(context);
    }

    public ExtendedWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public boolean canScrollHor(int direction) {
        final int offset = computeHorizontalScrollOffset();
        final int range = computeHorizontalScrollRange() - computeHorizontalScrollExtent();
        if (range == 0) return false;
        if (direction < 0) {
            return offset > 0;
        } else {
            return offset < range - 1;
        }
    }
}

Важно: Не забудьте указать свой ExtendedWebView внутри файла макета вместо стандартного WebView.

Расширение ViewPager

Теперь вам нужно расширить ViewPager, чтобы правильно обрабатывать горизонтальные движения. Это необходимо сделать в любом случае - независимо от того, используете ли вы ICS или нет:

public class WebViewPager extends ViewPager {
    public WebViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
        if (v instanceof ExtendedWebView) {
            return ((ExtendedWebView) v).canScrollHor(-dx);
        } else {
            return super.canScroll(v, checkV, dx, x, y);
        }
    }
}

Важно: Не забудьте указать свой WebViewPager в файле макета вместо стандартного ViewPager.

Вот и все!

Обновление 2012/07/08: Я недавно заметил, что показанные выше вещи, похоже, больше не требуются при использовании «текущей» реализации ViewPager. Кажется, что «текущая» реализация правильно проверяет вложенные представления перед тем, как захватить событие прокрутки самостоятельно (см. canScroll метод ViewPager здесь ). Не знаю точно, когда реализация была изменена для правильной обработки - мне все еще нужен код выше для Android Gingerbread (2.3.x) и ранее.

0 голосов
/ 10 ноября 2013

Хотя Свен упоминается для файла макета, я хочу добавить детали.После того, как вы расширили классы Webview и ViewPager,

Внутри вашей деятельности вы приведете к вашему расширенному классу так:

web = (MyWebView) findViewById(R.id.webview);

Внутри вашего файла макета, например:

<your.package.name.MyWebView
  android:id="@+id/webview"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" 
 />
...