![](/img/trans.png)
[英]How can I use the RecyclerView to open specific pages in ViewPager?
[英]How can I shake ViewPager to show the user that there are more pages available?
我的应用程序中有一个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
以便用户可以简短地看到下一页的边缘。
根据要求,下面是一个代码片段:
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数量,直到获得所需的效果为止。
如果要摇动它,可以使用动画。
我为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
使用此代码,但是,您需要确定何时首次加载数据。 但是我认为您不会对此有任何疑问。
祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.