2024. 5. 3. 13:09ㆍAndroid
안녕하세요
이번에 프로젝트 기능중 여러이미지 를 자동으로 스크롤 하는 기능을 만들게 되었습니다.
ViewPager2 를 이용하여 여러이미지 형태를 만들었는데
ViewPager2 에서 지원하는 함수중
ViewPager.setCurrentItem(Position, true)
이런 기능이 있습니다. 원하는 포지션으로 이동하는 함수입니다.
만약 5초마다 스크롤을 하게된다 하면 생각보다 스크롤 속도가 빨라 부자연스럽게 보일 수도 있고.
원하는 속도로 제어가 필요할수도있습니다.
기본형태 모습

ViewPager2 자체에 setCurrentItem 함수 기능중 스크롤 속도를 조절하는 기능은 따로 없어서 직접 구현을 해야합니다.
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 을 사용 하시면 됩니다.
적용모습

감사합니다.
'Android' 카테고리의 다른 글
Android PowerManager (앱 강제로 깨우기) (0) | 2024.05.13 |
---|---|
Android DeepLink onNewIntent (LifeCycle 생명주기) (0) | 2024.05.10 |
Android Compose GlideImage 이미지 미리 캐싱하기 (preload) (2) | 2024.04.26 |
Android Compose AnimatedVisibility 애니메이션 활용 (0) | 2024.04.26 |
Android Compose LazyColumn (RecyclerView 대체) (0) | 2024.04.25 |