我的应用程序中有一个ViewPager,我希望它在第一次加载时动摇。这是为了向用户显示可用的页面更多。我怎样才能以编程方式实现?
但是,我不希望寻呼机自动滚动到下一页。
答案 0 :(得分:3)
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
,以便用户可以短暂地看到下一页的边缘。
根据要求,这是一段代码:
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数量,直到获得所需的效果。
答案 1 :(得分:0)
如果你想摇动它,可以使用动画。
我为FloatingActionButton
做了同样的事情,并且效果很好。
对于ViewPager
,请查看此代码:
ObjectAnimator shakeAnimation=ObjectAnimator.ofFloat(yourViewPager,View.TRANSLATION_X,-25f,25f);
shakeAnimation.setDuration(100);
shakeAnimation.setRepeatCount(2);
shakeAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
yourViewPager.setTranslationY(0f);
}
});
shakeAnimation.start();
你可以方便地调整翻译,在我的情况下它只是[-25,25]。你也可以设置动画的持续时间和重复计数。
首次加载数据时,您可以将此代码用于ViewPager
,但是,您需要确定第一次加载数据的时间。但我不认为你会遇到问题。