alibaba / UltraViewPager

UltraViewPager is an extension for ViewPager to provide multiple features in a single ViewPager.
MIT License
5k stars 680 forks source link

源码UltraViewPagerView中onInterceptTouchEvent方法的疑问 #100

Open minamihoshi opened 6 years ago

minamihoshi commented 6 years ago
源码如下

private MotionEvent swapTouchEvent(MotionEvent event) { float width = getWidth(); float height = getHeight();

    float swappedX = (event.getY() / height) * width;
    float swappedY = (event.getX() / width) * height;

    event.setLocation(swappedX, swappedY);

    return event;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    if (scrollMode == UltraViewPager.ScrollMode.VERTICAL) {
       boolean intercept = super.onInterceptTouchEvent(swapTouchEvent(ev));
        //If not intercept, touch event should not be swapped.
        swapTouchEvent(ev);

        return intercept;
    }
    return super.onInterceptTouchEvent(ev);
}

onInterceptTouchEvent方法中 boolean intercept = super.onInterceptTouchEvent(swapTouchEvent(ev)); 已将坐标转换后的ev传入父类方法判断是否拦截 下一行中调用的swapTouchEvent(ev); 作用是什么呢?

MikeAfc commented 6 years ago

目的是交换横纵坐标,以实现竖向滑动的效果

minamihoshi commented 6 years ago

在super那行不是已经转换过了么。 @MikeAfc

cat9 commented 6 years ago

这种swap event的方法来实现竖向滑动的方法(即使按比例做了适配),虽然看起来可行,但实际上使用的时候有问题的,特别是宽高比差异大的情况下,这种感受特别严重。有时候,你在竖直方向下滑动一个距离,但它被按比例转换成横坐标的时候,转化成一个很小的值,导致viewpager认为这个距离并不应该翻页。但你实际上认为这个距离,在竖直方向上,是达到了翻页的临界点的了。 我在实际项目上遇到了这个问题。所以我把viewpager的源码复制过来,改了部分源码,才最终解决这个问题

DavikChen commented 5 years ago

辛苦把你改的viewpager 源码分享出来