我的应用程序中有一个 ViewPager,我希望它在第一次加载时摇晃。这是为了向用户显示有更多页面可用。我怎样才能以编程方式实现这一目标?
但是,我不希望寻呼机自动滚动到下一页。
最佳答案
ViewPager
有一个以编程方式滑动的方法:fakeDragBy
https://developer.android.com/reference/android/support/v4/view/ViewPager.html#fakeDragBy(float)
以下是实现此目标的方法:
- 调用
viewPager.beginFakeDrag()
- 开始做动画师。在
AnimatorUpdateListener
覆盖onAnimationUpdate
中,它调用viewPager.fakeDragBy()
- 在
AnimatorListener
中重写onAnimationEnd
所以它调用viewPager.endFakeDrag()
在这个调用之后,ViewPager
应该回到初始页面。
vpaliyX 使用翻译的答案不会显示下一页。您需要使用 fakeDragBy
以便用户可以短暂地看到下一页的边缘。
根据要求,这是一个代码 fragment :
private float drag;
...
@Override
protected void onResume() {
super.onResume();
mViewPager.postDelayed(new Runnable() {
@Override
public void run() {
mViewPager.beginFakeDrag();
drag = 0;
float density = getResources().getDisplayMetrics().density;
// 120 is the number of dps you want the page to move in total
ValueAnimator animator = ValueAnimator.ofFloat(0, 120 * density);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float progress = (float) valueAnimator.getAnimatedValue();
mViewPager.fakeDragBy(drag - progress);
drag = progress;
}
});
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) { }
@Override
public void onAnimationEnd(Animator animator) {
mViewPager.endFakeDrag();
}
@Override
public void onAnimationCancel(Animator animator) { }
@Override
public void onAnimationRepeat(Animator animator) { }
});
animator.setDuration(400);
animator.start();
}
}, 300);
}
我设置了 300 毫秒的启动延迟。我真的不知道是否有必要。
请注意表达式 drag - progress
,它给出一个负数。要向左滑动,您必须使用负值。
另请注意,我没有包含任何代码来确定这是否是应用程序第一次打开。
您可以调整开始延迟、动画持续时间和滑动的 dps 数,直到获得您想要的效果。
关于java - 如何摇动 ViewPager 以向用户显示有更多页面可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40891495/