2016-11-30 5 views
1

У меня есть ViewPager в моем приложении, и я бы хотел, чтобы он дрожал, когда он был загружен в первый раз. Это покажет пользователю, что доступно больше страниц. Как я могу добиться этого программно?Как я могу встряхнуть ViewPager, чтобы показать пользователю, что есть больше доступных страниц?

Однако я не хочу, чтобы пейджер автоматически прокручивался до следующей страницы.

+0

Изображение слайдера может быть хорошим подходом для этого –

ответ

1

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, которое дает отрицательное число. Чтобы получить прокрутку влево, вы должны использовать отрицательное значение.

Также обратите внимание, что я не указал код, чтобы определить, было ли это при первом открытии приложения.

Вы можете играть со стартовой задержкой, продолжительностью анимации и количеством дпс, чтобы пронзить, пока не получите эффект, который вы ищете.

+0

Спасибо за ваш ответ. У меня возникли проблемы с 'AnimatorUpfateListener', и я хотел бы оценить фрагмент кода, чтобы увидеть, как он работает с' ViewPager' –

+0

См. Мой обновленный ответ. –

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, когда данные были загружены в первый раз, однако вам необходимо определить, когда данные были загружены в первый раз. Но я не думаю, что у вас будут проблемы с этим.

Удачи вам!