A.R*_*R.H 2 java user-interface android user-experience
我的应用程序中有一个 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);
}
Run Code Online (Sandbox Code Playgroud)
我输入了 300 毫秒的启动延迟。我真的不知道这是否有必要。
请注意drag - progress给出负数的表达式。要向左滑动,您必须使用负值。
另请注意,我没有包含任何代码来确定这是否是第一次打开应用程序。
您可以调整开始延迟、动画持续时间和滑动的 dps 数量,直到获得所需的效果。