簡體   English   中英

在ViewPager中水平滾動webview

[英]Scroll webview horizontally inside a 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;
}

以下是一個真正有效的解決方案,只要它可以滾動,它將在水平滑動上滾動WebView 如果WebView無法進一步滾動,則ViewPager將使用下一個水平滑動來切換頁面。

擴展WebView

使用API​​級別14(ICS),引入了View方法canScrollHorizontally() ,我們需要解決該問題。 如果您僅為ICS或更高版本開發,則可以直接使用此方法並跳到下一部分。 否則,我們需要自己實現此方法,以使解決方案也適用於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的“當前”實現時,似乎不再需要上面顯示的ViewPager “當前”實現似乎在捕獲滾動事件之前正確檢查子視圖(請參閱此處ViewPager canScroll方法)。 不確切地知道,當實現已經改變以正確處理這個問題 - 我仍然需要Android Gingerbread(2.3.x)及之前的代碼。

雖然Sven提到布局文件我想添加細節。 在擴展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" 
 />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM