Android 에 서 는 RxJava 와 ViewPager 로 라운드 맵 을 구현 합 니 다.

머리말
많은 사람들 이 라운드 맵 을 실현 하려 면 ViewPager+Handler 를 사용 하여 라운드 맵 을 완성 하 는 효 과 를 생각 할 것 이다.그러나 RxJava 가 빠르게 발전 하 는 상황 에서 Handler 대신 RxJava 를 사용 하여 이런 임 무 를 완성 할 수 있다.
RxJava+ViewPager 의 윤 방 도 를 어떻게 실현 하 는 지 소개 한다.
효과 도 는 다음 과 같다

ViewPager 의 동작
ViwePager 하면 모두 가 낯 설 지 않 을 것 이다.일반적인 View 와 결합 해서 도 Fragment 와 함께 사용 할 수 있다.여기 서 나 도 그것 의 사용 방법 에 대해 너무 많은 소 개 를 하지 않 겠 다.직접 윤 방 방법 을 소개 하 다.
흔히 볼 수 있 는 라운드 조작.

private class ImageAdapter extends PagerAdapter{

 private ArrayList<ImageView> viewlist;

 public ImageAdapter(ArrayList<ImageView> viewlist) {
  this.viewlist = viewlist;
 }

 @Override
 public int getCount() {
  //     ,        
  return Integer.MAX_VALUE;
 }
 ....
}

private static class ImageHandler extends Handler{
 ...
 @Override
 public void handleMessage(Message msg) {
  super.handleMessage(msg);
  //               ,                     。
  if (activity.handler.hasMessages(MSG_UPDATE_IMAGE)){
   activity.handler.removeMessages(MSG_UPDATE_IMAGE);
  }
  switch (msg.what) {
   case MSG_UPDATE_IMAGE:
    currentItem++;
    activity.viewPager.setCurrentItem(currentItem);
    //      
    activity.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY);
    break;
   case MSG_KEEP_SILENT:
    //           
    break;
   case MSG_BREAK_SILENT:
    activity.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY);
    break;
   case MSG_PAGE_CHANGED:
    //       ,              。
    currentItem = msg.arg1;
    break;
   default:
    break;
  }
 }
 ...
}
이상 은 비교적 흔히 볼 수 있 는 라운드 맵 의 코드 입 니 다.저 는 인터넷 에서 마음대로 찾 았 을 뿐 입 니 다.우선 코드 는 PagerAdaptergetCount()를 그림 을 계속 재생 시 키 기 위 한 목적 으로 되 돌려 주 었 으 나,일부 극한 상황 에 서 는 crash 가 발생 할 수 있 으 며,되 돌아 오 는 수량 이 너무 많아 어느 정도 메모리 에 도 큰 소 모 를 가 져 왔 다.그 다음 에 우 리 는 handler 의 코드 가 매우 복잡 하고 많 을 뿐만 아니 라 논리 도 비교적 번 거 로 운 것 을 볼 수 있다.지금 우 리 는 아까 의 문제 에 대해 최 적 화 를 진행 하고 있다.
더 좋 은 라운드 조작.
더 좋 은 무한 재생:페이지 카드 보기 목록 을 설정 할 때 앞 뒤로 각각 페이지 카드 를 추가 합 니 다.맨 앞 에 마지막 그림 을 추가 하고 맨 뒤에 첫 번 째 그림 을 추가 합 니 다.그리고 맨 앞 페이지 카드 로 전환 할 때마다 마지막 두 번 째 페이지 카드 로 교체 합 니 다.마지막 카드 로 전환 할 때마다 두 번 째 카드 로 교체 합 니 다.이렇게 되면 일관성 이 형성 되 고 자 연 스 럽 게 무한 미끄럼 기능 이 이 루어 진다.
1)ViewPager 의 보기 목록 을 설정 할 때 앞 뒤로 각각 한 페이지 씩 추가 합 니 다.

for (int i = 0; i < count + 2; i++) {
 if (i == 0) {//                 
  Glide.with(context).
    load(imageTitleBeanList.get(count - 1).getImageUrl()).into(ivImage);
  tvTitle.setText(imageTitleBeanList.get(count - 1).getTitle());
 } else if (i == count + 1) {//                 
  Glide.with(context).
    load(imageTitleBeanList.get(0).getImageUrl()).into(ivImage);
  tvTitle.setText(imageTitleBeanList.get(0).getTitle());
 } else {
  Glide.with(context).
    load(imageTitleBeanList.get(i - 1).getImageUrl()).into(ivImage);
  tvTitle.setText(imageTitleBeanList.get(i - 1).getTitle());
 }
 //      View   View   
 viewList.add(view);
}
2)ViewPager 의 페이지 카드 상태 변경 을 감청 할 때 첫 번 째 페이지 카드 로 미 끄 러 졌 을 때 마지막 두 번 째 페이지 카드 로 교체 합 니 다.마지막 페이지 카드 로 미 끄 러 졌 을 때 두 번 째 페이지 카드 로 바 꿉 니 다.

@Override
public void onPageScrollStateChanged(int state) {
 switch (state) {
  //    
  case ViewPager.SCROLL_STATE_IDLE:
   // “    ”
   if (vpImageTitle.getCurrentItem() == 0) {
    vpImageTitle.setCurrentItem(count, false);
   } else if (vpImageTitle.getCurrentItem() == count + 1) {
    vpImageTitle.setCurrentItem(1, false);
   }
   currentItem = vpImageTitle.getCurrentItem();
   break;
 }
}
Handler 는 이제 RxJava 로 대체 해 야 합 니 다.
Interval 연산 자
정 해진 시간 간격 으로 정수 시퀀스 를 발사 하 는 Observable 을 만 듭 니 다.

Interval 연산 자 는 Observable 을 되 돌려 줍 니 다.고정된 시간 간격 으로 무한 증가 하 는 정수 서열 을 발사 합 니 다.

RxJava 는 이 조작 자 를 interval 방법 으로 구현 합 니 다.그것 은 시간 간격 을 나타 내 는 매개 변수 와 시간 단 위 를 나타 내 는 매개 변 수 를 받는다.
Javadoc: Integer.MAX_VALUE;Javadoc: interval(long,TimeUnit)
interval 은 기본적으로 computation 스케줄 러 에서 실 행 됩 니 다.스케줄 러 를 지정 하기 위해 선택 할 수 있 는 Scheduler 인 자 를 전달 할 수도 있 습 니 다.
Handler 대신 RxJava

public void start() {
 mViewPagerSubscribe = Observable.interval(5, 5, TimeUnit.SECONDS) // 5s   ,5s     
  .subscribeOn(AndroidSchedulers.mainThread())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(new Action1<Long>() {
   @Override
   public void call(Long aLong) {
    //       
    if (mWeeklyMovieInfos != null && mWeeklyMovieInfos.size() > 0 && isAutoPlay) {
     mCurrentPage++;
     mWeeklyViewPager.setCurrentItem(mCurrentPage);
    }
   }
  });
}
더 좋 은 사용자 체험 을 위해 서 는 사용자 가 미끄럼 작업 을 할 때 자동 윤 방 을 멈 춰 야 한다.

mPager.setOnTouchListener(new View.OnTouchListener() {
 @Override
 public boolean onTouch(View v, MotionEvent event) {
 //  ViewPager     ,            ,            
  switch (event.getAction()){
   case MotionEvent.ACTION_DOWN:
    stop();
    break;
   case MotionEvent.ACTION_UP:
    start();
    break; 
  }
  return false;
 }});

public void stop() {
 if(mViewPagerSubscribe.isUnsubscribed()) { 
  mViewPagerSubscribe.unsubscribe();
 }
}
총결산
이 글 은 주로 ViewPager 가 윤 방 도 를 실현 하 는 것 에 대한 총 결 이다.먼저 더 좋 은 윤 방도 방법 을 제 시 했 는데 사실은 RxJava 에서 interval 조작 부호 의 사용 을 설 명 했 고 마지막 으로 이 조작 부호 로 Handler 를 교체 하여 윤 방도 완벽 하 게 실현 했다.이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기