28 Stimmen

Horizontales Scrollen der Webansicht innerhalb eines ViewPagers

Ich habe eine WebView, die ein Bild lädt, in einen ViewPager gesetzt. Wenn ich versuche, das Bild horizontal zu scrollen, gehe ich zur nächsten Ansicht über, anstatt das Bild zu scrollen.

Ist es möglich, den Bildlauf bis zum Ende des Bildes zu führen, bevor die nächste Ansicht angezeigt wird?

@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;
}

44voto

sven Punkte 4140

Im Folgenden wird eine funktionierende Lösung vorgestellt, die die WebView bei einer horizontalen Wischbewegung so lange, wie es scrollen kann. Wenn die WebView nicht weiter scrollen kann, wird die nächste horizontale Wischbewegung von der ViewPager um die Seite zu wechseln.

Ausweitung der WebView

Mit API-Level 14 (ICS) wird die View Methode canScrollHorizontally() eingeführt, die wir brauchen, um das Problem zu lösen. Wenn Sie nur für ICS oder höher entwickeln, können Sie diese Methode direkt verwenden und zum nächsten Abschnitt übergehen. Andernfalls müssen wir diese Methode selbst implementieren, damit die Lösung auch auf pre-ICS funktioniert.

Leiten Sie dazu einfach Ihre eigene Klasse von 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;
        }
    }
}

Das ist wichtig: Denken Sie daran, auf Ihre ExtendedWebView innerhalb Ihrer Layoutdatei anstelle der Standard WebView .

Ausweitung der ViewPager

Nun müssen Sie die ViewPager um horizontale Wischbewegungen korrekt zu behandeln. Dies muss in jedem Fall geschehen - unabhängig davon, ob Sie ICS verwenden oder nicht:

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);
        }
    }
}

Das ist wichtig: Denken Sie daran, auf Ihre WebViewPager innerhalb Ihrer Layoutdatei anstelle der Standard ViewPager .

Das war's!

Update 2012/07/08: Ich habe kürzlich festgestellt, dass die oben gezeigten Dinge nicht mehr erforderlich zu sein scheinen, wenn man die "aktuelle" Implementierung des ViewPager . Die "aktuelle" Implementierung scheint die Unteransichten korrekt zu prüfen, bevor sie das Bildlaufereignis selbst erfasst (siehe canScroll Methode der ViewPager ici ). Ich weiß nicht genau, wann die Implementierung geändert wurde, um dies korrekt zu handhaben - ich brauche immer noch den obigen Code auf Android Gingerbread (2.3.x) und davor.

1 Stimmen

Funktioniert es, wenn ein Webview ein Java-Skript mit Spin-Funktionalität wie z.B. einem rotierenden Globus enthält?

0 Stimmen

@Ads: Ich habe das noch nicht ausprobiert - Sie müssen es selbst versuchen, tut mir leid.

1 Stimmen

Danke! Ich habe Ihre Lösung für das vertikale Scrollen innerhalb von WebViews bei VerticalViewPager, basierend auf Martin Sonc's Projekt, für Froyo+ verwendet. github.com/Sash0k/VerticalViewPager

-1voto

trante Punkte 32326

Obwohl Sven für die Layout-Datei erwähnt hat, möchte ich ein Detail hinzufügen. Nachdem Sie Webview und ViewPager Klassen erweitern,

Innerhalb Ihrer Aktivität werden Sie auf Ihre erweiterte Klasse wie folgt zurückgreifen:

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

Innerhalb Ihrer Layout-Datei wie folgt:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X