Android FlipView 使 ViewPager 滑动第一项没有动画

Android FlipView make ViewPager swipe first item without animation

我对该主题有疑问,现在我的情况是我在 scrollview 中有一个 viewpager,在 emilsjolander FlipView 中有这些,结构如下:

 <FlipView>
        <ScrollView>
        <ViewPager>
        </ViewPager>
        </ScrollView>
 </FlipView>

并且由于 viewpager 的某些问题无法检测到触摸,所以我只实现了自定义 Viewpager。

实现自定义Viewpager 后,触摸问题得到解决,但viewpager 的动画有问题。

当我滑动 viewpager 时,有时它工作得很好,但有时 viewpager 只是在没有动画的情况下更改项目,似乎第一个项目更改为 Sec Item 必须导致这种情况。所以我只是将一些日志放入 ScrollerCustomDuration class 的 startScroll 方法中,我发现当 viewpager 在没有动画的情况下发生变化时,不会调用 ScrollerCustomDuration 的 startScroll 方法。

很抱歉我的英语不好,谢谢你的帮助,如果你需要我提供这个问题的更多细节,请告诉我。

CustomViewPager Class:

public class CustomViewPager extends ViewPager {

private ScrollerCustomDuration mScroller = null;
public CustomViewPager(Context context) {
    super(context);
    postInitViewPager();
}

public CustomViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    postInitViewPager();
}


@Override
public boolean onInterceptTouchEvent(MotionEvent event) {

    Log.e("onInterceptTouchEvent",event.toString());

    switch (event.getAction()) {
        case MotionEvent.ACTION_MOVE:

            this.getParent().requestDisallowInterceptTouchEvent(true);
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            this.getParent().requestDisallowInterceptTouchEvent(false);
            break;
    }


    return super.onInterceptTouchEvent(event);


}

private void postInitViewPager() {
    try {
        Class<?> viewpager = ViewPager.class;
        Field scroller = viewpager.getDeclaredField("mScroller");
        scroller.setAccessible(true);
        Field interpolator = viewpager.getDeclaredField("sInterpolator");
        interpolator.setAccessible(true);

        mScroller = new ScrollerCustomDuration(getContext(),
                (Interpolator) interpolator.get(null));
        scroller.set(this, mScroller);
    } catch (Exception e) {
        Log.e("MyPager", e.getMessage());
    }
}


public void setScrollDurationFactor(double scrollFactor) {
    mScroller.setScrollDurationFactor(scrollFactor);
}}

ScrollerCustomDuration Class :

public class ScrollerCustomDuration extends Scroller {

private double mScrollFactor = 1;

public ScrollerCustomDuration(Context context) {
    super(context);
}

public ScrollerCustomDuration(Context context, Interpolator interpolator) {
    super(context, interpolator);
}

@SuppressLint("NewApi")
public ScrollerCustomDuration(Context context, Interpolator interpolator, boolean flywheel) {
    super(context, interpolator, flywheel);
}

/**
 * Set the factor by which the duration will change
 */
public void setScrollDurationFactor(double scrollFactor) {
    mScrollFactor = scrollFactor;
}

@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
    Log.e("##### FIX flash issue",""+startX);
    Log.e("##### FIX flash issue",""+startY);
    Log.e("##### FIX flash issue",""+dx);
    Log.e("##### FIX flash issue",""+dy);
    Log.e("##### FIX flash issue",""+duration);

    super.startScroll(startX, startY, dx, dy, (int) (duration * mScrollFactor));
}

}

我刚刚解决了这个问题。 看来问题不在于触摸。 我只是在 flipview flip

时刷新 flipview

下面的代码解决了我的问题

fv.setOnFlipListener(new FlipView.OnFlipListener() {
        @Override
        public void onFlippedToPage(FlipView v, int position, long id) {

            ((BaseAdapter)fv.getAdapter()).notifyDataSetChanged();
        }
    });