我正在开发一个循环ViewPager,我已经实现了这个完全解决方案(https://stackoverflow.com/a/12965787/1083564)。
唯一缺少的是,当我使用setCurrentItem(int i,bol b)方法时,我需要smoothScroll,它立即进入像素限制,而不使用smoothScroll。
我已经有权使用此方法,使用以下代码:
package android.support.v4.view;
import android.content.Context;
import android.util.AttributeSet;
public class MyViewPager extends ViewPager {
public MyViewPager(Context context) {
super(context);
}
public MyViewPager(Context context, AttributeSet attr) {
super(context, attr);
}
public void smoothScrollTo(int x, int y, int velocity) {
super.smoothScrollTo(x, y, velocity);
}
}
但我无法弄清楚在哪里以及如何使用它。我在ViewPager上的setOnPageChangeListener中使用此代码,我需要运行平滑的像素数:
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
Log.d( "viewpager", positionOffsetPixels+"");
}
在它变为0之前,由于setCurrentItem,我立即得到像素值到达0(向左)或x(向右,取决于屏幕)。我不知道怎样才能得到这个x号。
PS:我认为这个解决方案是IMDB应用程序使用的解决方案。您可以看到此滚动从第一个滚动到最后一个而不是一个滚动,而不会移开您的手指(使用2个手指来执行此操作)。您将看到“白色限制”将显示在ViewPager的左侧。唯一的区别是他们知道在使用setCurrentItem之后如何平滑滚动。
如果您需要更多信息,请询问!谢谢!
答案 0 :(得分:3)
问题:当您检测到必须执行循环滚动时,立即调用setCurrentItem
将导致ViewPager立即滚动到真实片段而不会平滑滚动,因为它设置为false。
解决方案:相反,允许ViewPager像其他片段一样平滑地滚动到假片段,然后在平滑滚动设置为false的一段延迟后滚动到真实片段。用户不会注意到更改。
当我们执行循环滚动时,请在运行中调用setCurrentItem
并延迟一些。使用onPageSelected
了解所选页面的索引。
public void onPageSelected(int position) {
// Consider eg. : C' A B C A'
boolean circularScroll = false;
if(position == 0) {
// Position 0 is C', we need to scroll to real C which is at index 3.
position = mPager.getAdapter().getCount() - 2;
circularScroll = true;
}
int lastIndex = mPager.getAdapter().getCount() - 1;
if(position == lastIndex) {
// Last index is A', we need to scroll to real A, which is at index 1.
position = 1;
circularScroll = true;
}
if(circularScroll) {
final int realPosition = position;
mPager.postDelayed(new Runnable() {
@Override
public void run() {
mPager.setCurrentItem(realPosition, false);
}
}, 500L);
}
}
答案 1 :(得分:0)
当你将setCurrentItem的第二个参数设置为true时,它应该平滑滚动
@Override
public void onPageScrollStateChanged (int state) {
if (state == ViewPager.SCROLL_STATE_IDLE) {
int curr = viewPager.getCurrentItem();
int lastReal = viewPager.getAdapter().getCount() - 2;
if (curr == 0) {
viewPager.setCurrentItem(lastReal, true);
} else if (curr > lastReal) {
viewPager.setCurrentItem(1, true);
}
}
}