使ViewPager + WebView连续垂直滑动的方法

8
我正在编写一个HTML页面阅读器,无法加载所有的.html文件,因为它太大了,性能很差。所以我决定将它分成3个(或更多)HTML文件,并在Web视图中嵌套View Pager(垂直滑动)中加载。

我的问题是我需要慢慢地滑动来滚动Web视图,快速滑动来改变View Pager。

慢速滑动

enter image description here

快速滑动会在ViewPager上更改页面。

enter image description here

1) 我能否将Webview扩展到Viewpager中的所有内容高度? 2) 只有在topScroll或endScroll时才能更改Viewpager项?

我已经尝试过的:

CustomWebView

 @Override
    public boolean onTouchEvent(MotionEvent event) {
        requestDisallowInterceptTouchEvent(true);

        return super.onTouchEvent(event);
    }

我尝试过,但无法更改viewpager项目。

所以我考虑在到达顶部或末尾时启用/禁用它。

移除了webview的onTouchEvent并添加了:

   @Override
    protected void onScrollChanged(final int l, final int t, final int oldl, final int oldt) {
        requestDisallowInterceptTouchEvent(true);



        int height = (int) Math.floor(this.getContentHeight() * this.getScale());
        int webViewHeight = this.getMeasuredHeight();

        boolean scrollTop = this.getTop() == t;
        boolean scrollEnd = this.getScrollY() + webViewHeight >= height;

        if(scrollTop || scrollEnd) {
            requestDisallowInterceptTouchEvent(false);
        } 

我经常遇到的问题是页面工作不稳定,最常见的情况是当我切换页面时,必须向下滚动并向上滚动以将requestDisallow设置为false,这样才能切换页面 =[

Vertical CustomViewPage是这个 ->

public class VerticalViewPager extends ViewPager {

    public VerticalViewPager(Context context) {
        super(context);
        init();
    }

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

    private void init() {
        // The majority of the magic happens here
        setPageTransformer(true, new VerticalPageTransformer());
        // The easiest way to get rid of the overscroll drawing that happens on the left and right
        setOverScrollMode(OVER_SCROLL_NEVER);
    }

    private class VerticalPageTransformer implements ViewPager.PageTransformer {

        @Override
        public void transformPage(View view, float position) {

            if (position < -1) { // [-Infinity,-1)
                // This page is way off-screen to the left.
                view.setAlpha(0);

            } else if (position <= 1) { // [-1,1]
                view.setAlpha(1);

                // Counteract the default slide transition
                view.setTranslationX(view.getWidth() * -position);

                //set Y position to swipe in from top
                float yPosition = position * view.getHeight();
                view.setTranslationY(yPosition);

            } else { // (1,+Infinity]
                // This page is way off-screen to the right.
                view.setAlpha(0);
            }
        }
    }

    /**
     * Swaps the X and Y coordinates of your touch event.
     */
    private MotionEvent swapXY(MotionEvent ev) {
        float width = getWidth();
        float height = getHeight();

        float newX = (ev.getY() / height) * width;
        float newY = (ev.getX() / width) * height;

        ev.setLocation(newX, newY);

        return ev;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev){
        boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
        swapXY(ev); // return touch coordinates to original reference frame for any child views
        return intercepted;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return super.onTouchEvent(swapXY(ev));
    }

}

你尝试将它添加到滚动视图中了吗? - mooga
@g33k 是的,没有改变,当我快速滚动时,viewpager会切换页面(并使用RequestDisallowIntercept禁用viewpager)。 - user2582318
你做完了吗? - NIKUNJ GADHIYA
1个回答

3
  • 我认为将您的内容分成3个不同的HTML文件并将它们放在3个不同的WebViews上是一个不好的主意。
  • 3个文件可能是一个好主意,但是在ViewPager的3个视图中使用3个WebView是一个不好的主意。
  • 相反,您应该使用".js" / "jQuery"检测网页的顶部和底部,并在同一个WebView中路由页面/HTML。

    window.onscroll = function(ev) { if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) { // you're at the bottom of the page }};

有很多方法可以检测HTML内容的顶部和底部。

如果您想增加评论框的高度以适应内容高度,请使用获取WebView加载后的内容高度(Android),这对我有效。


嗯,我明白了。这可能是个好主意,我会研究一下并检查是否是一个好选择,然后再回来。 - user2582318
你有想到一些可以做这个的应用程序吗?你可以下载readEra并打开一本电子书,你会看到请求的内容,我试图找到一些相关的资源,但没有成功。 - user2582318

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接