Прокрутка веб-просмотра по горизонтали внутри 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"
/>