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 를 교체 하여 윤 방도 완벽 하 게 실현 했다.이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
RxJava의 다양한 장면 구현 요약timer+map 방법으로 실현할 수 있습니다.코드는 다음과 같습니다. 이런 장면은 Observable.zip를 사용하여 실현할 수 있다. 즉, 첫 번째observable의 첫 번째 위치의 데이터가 발생한 후에 두 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.