본문 바로가기
IT Study/Android

[Android] Fragment에 TimeTask를 이용한 Auto Scroll View Pager 구현

by dev_huhu 2019. 12. 5.
반응형

자동 스크롤 ViewPager는 이런 기능을 가지고 있다.

  • 일정 주기마다 페이지를 이동한다.
  • 끝 페이지에 도달하면 다시 첫 페이지로 이동해야 한다.
  • 사용자가 직접 페이지 전환할 수 있어야 한다.

 

그럼 외부 라이브러리를 끌어쓰지않고 직접 구현해보자.

onCreateView()에 모두 구현을 하지않고 굳이 onResume()와 onPause()로 나눈 이유는

다른 Activity나 Fragment로 전환되면 ViewPager는 그 페이지에 머물러 있길 원했기 때문이다. 

+ Activity에 구현할 시 onCreate()만 고쳐주면 차이가 없을거 같습니다.

+ PagerAdapter 구현부와 xml은 관련 자료가 많아서 따로 올리지 않았습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public class Test1 extends Fragment {
    ViewPager vewPager;
      int images[] = {R.drawable.img_1, R.drawable.img_2, R.drawable.img_3, R.drawable.img_4};  // images배열에 원하는 이미지 삽입
    MyCustomPagerAdapter myCustomPagerAdapter; // PagerAdapter 상속받아 구현한 class
    int currentPage = 0;
 
    Timer timer;
    final int NUM_PAGES = images.length;  // 이미지의 총 갯수
    final long DELAY_MS = 3000;           // 오토 플립용 타이머 시작 후 해당 시간에 작동(초기 웨이팅 타임) ex) 앱 로딩 후 3초 뒤 플립됨.
    final long PERIOD_MS = 5000;          // 5초 주기로 작동
 
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.frag_1, container, false);
 
        viewPager = (ViewPager)root.findViewById(R.id.viewPager);
        myCustomPagerAdapter = new MyCustomPagerAdapter(getContext(), images);
        viewPager.setAdapter(myCustomPagerAdapter);
 
        return root;
    }
 
    @Override
    public void onResume() {
        super.onResume();
   
            // Adapter 세팅 후 타이머 실행
            final Handler handler = new Handler();
            final Runnable Update = new Runnable() {
                public void run() {
                    currentPage = viewPager.getCurrentItem();
                    int nextPage = currentPage + 1;
                    
                    if (nextPage >= NUM_PAGES) {
                        nextPage = 0;
                    }
                    viewPager.setCurrentItem(nextPage, true);
                    currentPage = nextPage;
                }
            };
 
            timer = new Timer(); // thread에 작업용 thread 추가
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    handler.post(Update);
                }
            }, DELAY_MS, PERIOD_MS);
 
    }
 
    @Override
    public void onPause() {
        super.onPause();
        // 다른 액티비티나 프레그먼트 실행시 타이머 제거
// 현재 페이지의 번호는 변수에 저장되어 있으니 취소해도 상관없음
        if(timer != null) {
            timer.cancel();
            timer = null;
        }
    }
 
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

안되는 부분이 있으면 언제든 댓글로 알려주세요!!

반응형

댓글