2

我想顯示具有反彈/彈性滑動效果的ViewPager。我想這可以使用PageTransformerBounceInterpolator的某種組合。在ViewPager中實現彈性/反彈動畫效果的最佳方式是什麼?

我不知道的是如何。到目前爲止,我一直無法做到這一點。

一個PageTransformer的一個典型例子是這樣的:

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

的問題是,我們如何把一個Interpolator(任何種類的)到這裏了嗎? 我們從哪裏獲得ViewPager動畫的Animation對象,以便爲其設置Interpolator

我已經提到了以下職位:

第三篇文章有一個答案,提到這種方法,但沒有提供任何細節如何。

有誰知道我們怎樣才能把BounceInterpolatorPageTransformer結合起來?這似乎是一個有機和一致的方法來解決這個問題,但它甚至可能呢?還是有另一個合乎邏輯的解決方案呢?

參考文獻:

N.B:

應該有可能實現的彈性/彈跳動畫效果簡單地通過組合InterpolatorPageTransformer,而無需延長ViewPager。其他方法也是受歡迎的,但請提供代碼的詳細解決方案,而不僅僅是一個大綱。

+0

這個例子會保持好嗎? https://github.com/chenupt/SpringIndicator – Stallion

+0

自定義viewpager並在onTTouchEvent中使用一組正在按順序播放的ValueAnimators縮放列表視圖。 – Piyush

回答

0

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

在Java類只能使用這樣的:

animateViewPager(pager, 10, 1000); 
0

我不確定PageTransformer是達到上述效果的最佳方式。請注意,這樣的轉換在兩個滑動方向上都是相同的,因爲接收的位置不知道我們是從左向右滑動還是反向滑動。也許你不想讓兩個相反的觀點彈跳,但只有一個,適用於拉。第二個和IMO更重要的是,用戶的手勢驅動框架,而不是穩定的系統時鐘。結果 - 我們無法控制淡入淡出階段的持續時間(當用戶釋放他/她的手指時的階段)並且實現平滑的行爲(因爲通常,蜱以非單調改變的位置遞送,這在很大程度上取決於接觸速度)。

因此,使用標準ValueAnimator API會更好,這將由OnPageChangeListener觸發。當然在這種情況下,我們還有另外一些注意事項,但這種方法似乎更有前途。

+0

謝謝你理解這個問題...... :) –

相關問題