Android Viewpager2 Auto Scroll Duration (자동 스크롤 속도 조절) java 버전

2024. 5. 3. 13:09Android

반응형

안녕하세요

 

이번에 프로젝트 기능중 여러이미지 를 자동으로 스크롤 하는 기능을 만들게 되었습니다.

 

ViewPager2 를 이용하여 여러이미지 형태를 만들었는데

 

ViewPager2 에서 지원하는 함수중

 

ViewPager.setCurrentItem(Position, true)

 

이런 기능이 있습니다. 원하는 포지션으로 이동하는 함수입니다.

 

만약 5초마다 스크롤을 하게된다 하면 생각보다 스크롤 속도가 빨라 부자연스럽게 보일 수도 있고.

 

원하는 속도로 제어가 필요할수도있습니다.

 

기본형태 모습

 

적용전

 

ViewPager2 자체에 setCurrentItem 함수 기능중 스크롤 속도를 조절하는 기능은 따로 없어서 직접 구현을 해야합니다.

 

https://stackoverflow.com/questions/57505875/change-viewpager2-scroll-speed-when-sliding-programmatically

 

Change ViewPager2 Scroll Speed when sliding programmatically

I know there is way to change animation duration of ViewPager programmatical slide (here). But its not working on ViewPager2 I tried this: try { final Field scrollerField = ViewPager2.c...

stackoverflow.com

 

해당 글을 참고하여 만들었지만

 

지금 제 기준에서는 java로 만든 버전이 필요하여

 

java로 변환 시켜보겠습니다.

 

 

public class CustomViewPager2Helper {

    private ViewPager2 viewPager;

    public CustomViewPager2Helper(ViewPager2 viewPager) {
        this.viewPager = viewPager;
    }

    public void setCurrentItemWithDuration(int item, long duration) {
        setCurrentItemWithDuration(item, duration, new AccelerateDecelerateInterpolator(), viewPager.getWidth());
    }

    public void setCurrentItemWithDuration(int item, long duration, TimeInterpolator interpolator, int pagePxWidth) {
        int pxToDrag = pagePxWidth * (item - viewPager.getCurrentItem());
        ValueAnimator animator = ValueAnimator.ofInt(0, pxToDrag);
        int[] previousValue = {0};

        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                int currentValue = (int) valueAnimator.getAnimatedValue();
                float currentPxToDrag = currentValue - previousValue[0];
                viewPager.fakeDragBy(-currentPxToDrag);
                previousValue[0] = currentValue;
            }
        });

        animator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
                viewPager.beginFakeDrag();
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                viewPager.endFakeDrag();
            }

            @Override
            public void onAnimationCancel(Animator animation) {
                // Ignored
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
                // Ignored
            }
        });

        animator.setInterpolator(interpolator);
        animator.setDuration(duration);
        animator.start();
    }
}

 

 

사용법

 

ViewPager2 viewPager;

        viewPager = findViewById(R.id.viewPager);
        CustomViewPager2Helper viewPagerHelper = new CustomViewPager2Helper(bottomViewPager);

        viewPagerHelper.setCurrentItemWithDuration(++position,2000);
//      viewPager.setCurrentItem(++position, true);

 

 

기존 setCurrentItem 대신 새로 만든 setCurrentItemWithDuration 을 사용 하시면 됩니다.

 

적용모습

 

 

감사합니다.

반응형