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();
}
});
我对该主题有疑问,现在我的情况是我在 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();
}
});