jeasonlzy / VerticalSlideView

类似淘宝的商品详情页,继续拖动查看详情,其中拖动增加了阻尼,并且重写了ListView,GridView,ScrollView,WebView,RecyclerView 的 dispatchTouchEvent 方法,使用的时候无须额外的代码,可以任意嵌套使用。
709 stars 164 forks source link

不完美解决未完全滑动scrollview的底部就切换下一页 #5

Open ysmintor opened 8 years ago

ysmintor commented 8 years ago

调试查了几小时发现出问题在这个地方

@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downX = ev.getX();
                downY = ev.getY();
                //如果滑动到了最底部,就允许继续向上滑动加载下一页,否者不允许
                getParent().requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_MOVE:
                float dx = ev.getX() - downX;
                float dy = ev.getY() - downY;
                boolean allowParentTouchEvent;
                if (Math.abs(dy) > Math.abs(dx)) {
                    if (dy > 0) {
                        //位于顶部时下拉,让父View消费事件
                        allowParentTouchEvent = isTop();
                    } else {
                        //位于底部时上拉,让父View消费事件
                        allowParentTouchEvent = isBottom();
                    }
                } else {
                    //水平方向滑动
                    allowParentTouchEvent = false; // 这里原来为true,我看代码也知道基本就不应该执行,但还是很空间触发,暂时就这样解决
                }
                getParent().requestDisallowInterceptTouchEvent(!allowParentTouchEvent);
        }
        return super.dispatchTouchEvent(ev);
    }

我试了 if (Math.abs(dy) > Math.abs(dx) * 0.01) 这样一个因子,也可以。有更好的解决办法吗? 我试这个因为我在scrollview里还嵌套了一个expandableListview,很是麻烦。