2012-11-13 8 views
1

나는 4 페이지를 가진 ViewPager을 가지고 있으며 자동으로 스크롤되기를 원합니다.뷰 페이지가 자동으로 너무 빠르게 스크롤됩니다.

내가하고있는 일은 TimerTask으로 바운드되어 있습니다. viewPager.setCurrentItem(index);index이 미리 계산 된 정수입니다.

로직은 정상적으로 작동하지만 스크롤하면 (setCurrentImte에 의해 트리거 됨) 애니메이션이 너무 빠릅니다.

어떻게 스크롤 속도를 제어 할 수 있습니까? 두 스크롤의 간격 대신에 스크롤 애니메이션 속도에 대해 이야기합니다.

답변

2

대신 ViewFlipper을 사용하지 않는 이유는 무엇입니까? ViewFlipper에는 뷰 사이의 자동 스크롤을 처리하는 기능이 내장되어있어 타이머를 덤프 할 수 있습니다. 또한 애니메이션을 완벽하게 제어 할 수있는 ViewAnimator을 구현합니다. 사용자 지정 애니메이션을 만드는 것은 비교적 간단하며 애니메이션을 만드는 데 걸리는 시간을 제어 할 수 있습니다. 슬라이드 애니메이션에 대한 간단한 자습서는 here에서 찾을 수 있습니다. 애니메이션 XML 파일의 duration 속성을 기록하십시오.

0

ViewPager 같은 API는 제공하지 않습니다. 다음 중 하나를 수행 할 것을 권해드립니다.

  • VieWPager 코드 (귀하의 android sdk extras 폴더 아래에 있음)를 가져 와서 필요한 방식 (예 : 필요한 API 추가)으로 twek하십시오. 이제 내부 상수 (MAX_SETTLE_DURATION)를 사용하는 것 같습니다.
  • 혼자서 만지는 것을 가로 채고 fakeDragBy() (그게 당신이 찾고있는 것인지 확실하지 않음)으로 전화하십시오.
0

왜 이렇게 해보지 않으시겠습니까? 값 애니메이터를 사용하여 스크롤 값에 애니메이션을 적용한 다음 단편로드가 올바르게 처리되도록 위치를 업데이트하십시오. 나를 위해 잘 작동 :).

if(pager != null){ 
     ValueAnimator scrollAnimator = ValueAnimator.ofInt(pager.getScrollX(), pager.getScrollX()+2560); 
     final int virtualPage = pager.getCurrentItem(); 
     scrollAnimator.setDuration(1000); 
     scrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
      @Override 
      public void onAnimationUpdate(ValueAnimator animation) { 
       pager.setScrollX((Integer)animation.getAnimatedValue()); 
      } 
     }); 
     scrollAnimator.addListener(new Animator.AnimatorListener() { 
      @Override 
      public void onAnimationStart(Animator animation) { 

      } 

      @Override 
      public void onAnimationEnd(Animator animation) { 
       pager.setCurrentVirtualItem(virtualPage, false); 
      } 

      @Override 
      public void onAnimationCancel(Animator animation) { 

      } 

      @Override 
      public void onAnimationRepeat(Animator animation) { 

      } 
     }); 
     scrollAnimator.start(); 
    } 
0

저는 앱을 개발할 때와 동일한 요구 사항을 갖고 있으며 해결책은 이것입니다.

Observable.range(1, vpAdapter.getCount() - 1) 
      .concatMap(i-> Observable.just(i).delay(5000, TimeUnit.MILLISECONDS)) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(integer -> { 
       currentAutoPage = integer; 

       binding.vpTour.beginFakeDrag(); 
       lastFakeDrag = 0; 
       ValueAnimator va = ValueAnimator.ofInt(0, binding.vpTour.getWidth()); 
       va.setDuration(1000); 
       va.addUpdateListener(animation -> { 
        if (binding.vpTour.isFakeDragging()) { 
         int animProgress = (Integer) animation.getAnimatedValue(); 
         binding.vpTour.fakeDragBy(lastFakeDrag - animProgress); 
         lastFakeDrag = animProgress; 
        } 
       }); 
       va.addListener(new AnimatorListenerAdapter() { 
        @Override 
        public void onAnimationEnd(Animator animation) { 
         super.onAnimationEnd(animation); 
         if (binding.vpTour.isFakeDragging()) { 
          binding.vpTour.endFakeDrag(); 
         } 
        } 
       }); 
       va.start(); 
      }, Throwable::printStackTrace,() -> { 
       if (autoPageChangeDisposable != null && !autoPageChangeDisposable.isDisposed()) { 
        autoPageChangeDisposable.dispose(); 
       } 
      }); 

이 경우 당신은 또한 사용자가 수동으로 그냥 이렇게 썼다이 코드에서 처분을받을보다 페이지를 변경할 때 자동으로 스 와이프를 중지하려면 : "일회용 autoPageChangeDisposable = Observable.range (1, vpAdapter. ... "및 Register 및 OnPageChangedListener보다 다음과 같이하십시오.

관련 문제