Прокрутка веб-просмотра по горизонтали внутри ViewPager

Я поместил 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 ответа

Решение

Ниже приводится реальное рабочее решение, которое прокручивает 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) и ранее.

Хотя Свен упоминается для файла макета, я хочу добавить детали. После расширения классов 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" 
 />
Другие вопросы по тегам