我想要实现的是,用户打开视图页面的第一页后,视图页面会反弹到第二页的一半,然后又反弹回第一页,以表示还有更多页面可以滚动。我想知道如何实现这个功能?
我想要实现的是,用户打开视图页面的第一页后,视图页面会反弹到第二页的一半,然后又反弹回第一页,以表示还有更多页面可以滚动。我想知道如何实现这个功能?
您可以使用fakeDragBy方法来实现此效果:
viewPager.beginFakeDrag();
viewPager.fakeDragBy(offset); //offset in pixels.
viewPager.endFakeDrag();
编辑:
我已经为此编写了一个方法:
private int animFactor;
private ValueAnimator animator = new ValueAnimator();
private void animateViewPager(final ViewPager pager, final int offset, final int delay) {
if (!animator.isRunning()) {
animator.removeAllUpdateListeners();
animator.removeAllListeners();
//Set animation
animator.setIntValues(0, -offset);
animator.setDuration(delay);
animator.setRepeatCount(1);
animator.setRepeatMode(ValueAnimator.RESTART);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
Integer value = animFactor * (Integer) animation.getAnimatedValue();
if (!pager.isFakeDragging()) {
pager.beginFakeDrag();
}
pager.fakeDragBy(value);
}
});
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
animFactor = 1;
}
@Override
public void onAnimationEnd(Animator animation) {
pager.endFakeDrag();
}
@Override
public void onAnimationRepeat(Animator animation) {
animFactor = -1;
}
});
animator.start();
}
}
使用示例:
animateViewPager(pager, 10, 1000);
编辑2: ValueAnimator是适用于Api级别11的类。在调用此方法之前,请设置页面适配器。
在@Yuraj的答案中添加一条注释。 当hasFocus == true
时,请在onWindowFocusChanged
中调用方法,以避免 indexOutOfBoundsException
:
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
if(hasFocus)
{
Handler handler = new Handler();
final Runnable r = new Runnable()
{
public void run()
{
if(mViewPager.getCurrentItem() == 0)
{
Context context = Activity_main.this;
String filename="Init";
SharedPreferences stats;
stats = context.getSharedPreferences(filename, 0);
int appOpen = stats.getInt("appOpen", 0);
if(appOpen <= 5)
{
animateViewPager(mViewPager, 10, 300);
appOpen += 1;
SharedPreferences.Editor editor = stats.edit();
editor.putInt("appOpen", appOpen);
editor.commit();
}
}
}
};
handler.postDelayed(r, WAIT_VIEWPAGER_NUDGE);
}
}
new Handler().postDelayed(() -> animateViewPager(viewPager, 10, 1000), 500);
500 是以毫秒为单位的延迟时间