Android Viewpager反弹到半页

时间:2014-08-24 20:12:16

标签: android android-viewpager android-animation

所以我想要实现的是用户将打开视图寻呼机的第一页,并且视图寻呼机将反弹到第二页的一半并反弹回第一页,表示有更多页面要滚动到。我想知道如何实现这个?

2 个答案:

答案 0 :(得分:13)

您可以使用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);

Edit2: ValueAnimator是Api级别11的类。还要在调用此方法之前设置寻呼机适配器。

答案 1 :(得分:1)

为@ Yuraj的回答添加注释。如果onWindowFocusChanged如下hasFocus==true,请按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); } }

Error:Error converting bytecode to dex:
Cause: Dex cannot parse version 52 byte code.
This is caused by library dependencies that have been compiled using Java 8 or above.
If you are using the 'java' gradle plugin in a library submodule add 
targetCompatibility = '1.7'
sourceCompatibility = '1.7'
to that submodule's build.gradle file.