liaoinstan / SpringView

🔥 A custom view pull to refresh,support ScrollView,ListView,RecyclerView,WebView and all another views, easy to use
Apache License 2.0
1.93k stars 353 forks source link

和左右滑动的控件有冲突,导致左右滑动控件的响应有问题 #2

Closed GhRyuJin closed 8 years ago

GhRyuJin commented 8 years ago

我在swipemenulistview外面嵌套了一个SpringView,导致swipermenulistview的滑动删除变得不好用了

liaoinstan commented 8 years ago

嵌入水平滑动的控件,目前确实会有手势冲突,后面会解决这个问题

Samsu7609 commented 8 years ago

我也是類似問題 使用套件是 RecyclerView LinearLayoutManager.HORIZONTAL 請問該朝什麼方向 解决这个问题 謝謝 套件好使用 呈現也很美 感謝

liaoinstan commented 8 years ago

你好,我是SpringView的作者,左右滑动确实存在滑动冲突,最近正好自己处于换工作期间,实在没有闲暇时间解决问题,SpringView的大体实现思路是在dispatchTouchEvent中对手势进行识别,通过设置isNeedMyMove标志位来决定将事件交给SpringView处理还是内部控件处理。左右滑动是我没有考虑到的,你可以修改dispatchTouchEvent中的isNeedMyMove()方法,判断滑动方向与竖直方向的夹角,大于45度认定为水平滑动,则返回false,将isNeedMyMove设置为false,这样滑动事件将交给内部控件处理,SpringView不做拦截

GhRyuJin commented 8 years ago

@Samsu7609 我一开始是打算在Springview里面的isNeedMyMove()方法里做修改的,后来改了发现有些问题,只能用一个变通的方法了,那就是继承内部控件(水平滑动的控件),重写dispatchTouchEvent方法,具体代码如下

    private int mLastY;  
    private int mLastX;  
    @Override  
    public boolean dispatchTouchEvent(MotionEvent ev) {
        int y = (int) ev.getY();
        int x = (int) ev.getX();
        switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            getParent().requestDisallowInterceptTouchEvent(true);
            break;
        case MotionEvent.ACTION_MOVE:
            int deltaY = y - mLastY;
            int deltaX = x - mLastX;
            if (Math.abs(deltaY)>Math.abs(deltaX)) {
                // 上下滑动的距离大于左右滑动的距离,请求父控件拦截
                getParent().requestDisallowInterceptTouchEvent(false);
            }
            break;
        default:
            break;
        }
        mLastX = x;
        mLastY = y;
        return super.dispatchTouchEvent(ev);
    }
Samsu7609 commented 8 years ago

@GhRyuJin 所以您是說 我需要 extends RecyclerView 然後 Override dispatchTouchEvent 來避免衝突的問題嗎?

謝謝