2

바운스/탄성 슬라이딩 효과가있는 ViewPager을 표시하고 싶습니다. 나는 이것이 PageTransformerBounceInterpolator의 조합을 사용하여 가능하다고 생각합니다.ViewPager에서 탄성/바운스 애니메이션 효과를 얻는 가장 좋은 방법은 무엇입니까?

안녕하세요. how입니다. 지금까지 나는 이것을 달성하지 못했습니다. 문제는, 우리가 어떻게 여기 그림에 Interpolator (어떤 종류의)을 가지고 않습니다되어

public class TypicalPageTransformer implements ViewPager.PageTransformer { 

    @Override 
    public void transformPage(View view, float position) { 

     if (position < -1) { // [-Infinity,-1) 
      // This page is way off-screen to the left. 
      view.setAlpha(0); 

     } else if (position <= 0) { // [-1,0] 
      // Use the default slide transition when moving to the left page 
      view.setAlpha(1); 
      view.setTranslationX(0); 
      view.setScaleX(1); 
      view.setScaleY(1); 

     } else if (position <= 1) { // (0,1] 
      // Fade the page out. 
      view.setAlpha(1 - position); 

      // Counteract the default slide transition 
      view.setTranslationX(pageWidth * -position); 

      // Scale the page down (between MIN_SCALE and 1) 
      float scaleFactor = MIN_SCALE 
        + (1 - MIN_SCALE) * (1 - Math.abs(position)); 
      view.setScaleX(scaleFactor); 
      view.setScaleY(scaleFactor); 

     } else { // (1,+Infinity] 
      // This page is way off-screen to the right. 
      view.setAlpha(0); 
     } 
    } 
} 

:

PageTransformer의 전형적인 예는 다음과 같이 될 것이다? ViewPager 님의 애니메이션에 대한 Animation 개체는 어디에서 가져 오지 않으므로 Interpolator을 설정해야하나요?

이미 다음 게시물에 언급 한 :

세 번째 게시물에는 이러한 접근 방식에 대한 대답이 있지만 어떻게 자세하게 설명되어 있지는 않습니다.

BounceInterpolatorPageTransformer을 어떻게 결합하는지 정확히 아는 사람이 있습니까? 이 이이 문제에 대한 유기적이고 일관된 접근 방식 인 것으로 보이지만 전혀 가능하지 않습니까? 아니면 이에 대한 또 다른 논리적 인 해결책이 있습니까?

참고 :

N.B :

단순히 InterpolatorPageTransformer 조합하여 탄성/반송 애니메이션 효과를 달성 할 수 있어야하고, ViewPager을 연장 할 필요없이. 다른 접근 방법도 환영합니다. 그러나 윤곽선이 아닌 코드와 함께 상세한 솔루션을 제공하십시오.

+0

이 예가 좋을까요? https://github.com/chenupt/SpringIndicator – Stallion

+0

viewpager를 사용자 정의하고 ontTouchEvent에서 순차적으로 재생되는 ValueAnimators 세트를 사용하여 listview를 조정합니다. – Piyush

답변

0

이 효과를 달성하기 위해 fakeDragBy 방법을 사용할 수 있습니다

viewPager.beginFakeDrag(); 
viewPager.fakeDragBy(offset); //offset in pixels. 
viewPager.endFakeDrag(); 

을 또는 당신은이 방법을 사용할 수 있습니다

animateViewPager(pager, 10, 1000); 
0

테이크 : 만이 자바 클래스 사용에

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(); 
    } 
} 

this library을 보시면 아마도 도움이 될 것입니다.

0

PageTransformer이 언급 된 효과를 얻는 가장 좋은 방법인지 확신 할 수 없습니다. 수신 된 위치는 왼쪽에서 오른쪽으로 또는 그 반대로 스 와이프할지 여부를 알 수 없으므로 이러한 전환은 두 스 와이프 방향 모두 동일합니다. 그리고 아마 당신은보기의 두 반대편의 반동을 원하지 않을 것입니다. 그러나 오직 하나만 끌어 당기면됩니다. 그리고 두 번째이자 가장 중요한 IMO는 PageTransformer 프레이밍이 안정적인 시스템 클럭이 아닌 사용자의 제스처에 의해 주도됩니다. 결과적으로 페이드 페이드 지속 시간 (사용자가 손가락을 떼었을 때의 위상)을 제어 할 수없고 매끄러운 동작을 얻을 수 없습니다 (일반적으로 틱은 터치 속도에 크게 의존하는 비 단조로 변경된 위치로 전달되기 때문).

표준 ValueAnimator API를 사용하면 OnPageChangeListener에 의해 트리거되는 것이 훨씬 더 좋습니다. 물론이 경우에는 또 다른 경고가 있지만이 방법이 더 유망한 것으로 보입니다.

+0

질문을 이해해 주셔서 감사합니다. :) –

관련 문제