AndroidではRxJavaとView Pagerでホイールショットを実現します。
前言
多くの人が輪播図を実現するには、ViewPager+Handlerを使って輪播図の効果を考えます。しかし、RxJavaが急速に発展している場合には、Handlerの代わりにRxJavaを使用してこのようなタスクを完了することができます。
RxJava+Viewer Pagerを実現するためのロードマップを紹介します。
効果図は以下の通りです
ビューPagerの操作
ViwePagerといえば、みんなよく知らないはずです。普通のViewと一緒にFragmentと一緒に使うこともできます。ここではその使い方をあまり紹介しません。直接にロードショーの方法を紹介します。
よくあるローテーション操作
より良いホイール操作
より良い無限再生:ページカード表示リストを設定すると、前後に各ページカードを追加します。一番前に最後の写真を入れて、一番後ろに1枚目の写真を入れます。そして一番前のページカードに切り替えるたびに、最後から2番目のページカードに置き換えます。最後のページカードに切り替えるたびに、2枚目のページカードに切り替えます。このように一貫して形成され、自然に無限スライドの機能を実現しました。
1)Viewer Pagerのビューリストを設定すると、前後にそれぞれ1ページずつカードを追加します。
Intervalオペレータ
整数系列を固定時間間隔で送信するObservableを作成します。
IntervalオペレータはObservableを返し、一定の時間間隔で無限インクリメントされた整数シーケンスを送信する。
RxJavaはこのオペレータをinterval方法として実現します。時間間隔を表すパラメータと時間単位を表すパラメータを受け取ります。
Javadoc:
Handlerの代わりにRxJavaを使う
この文章は主にViewPagerのための輪播図をまとめたものです。まず、より良いルーニーマップの方法を提案します。実はRxJavaのintervalオペレータの使用を説明しました。最後にこのオペレータを使ってHandlerを交替して、完全にルーニーマップを実現します。以上がこの文章の全部です。本文の内容が皆さんに役に立つことを望んでいます。もし疑問があれば、メッセージを残して交流してもいいです。
多くの人が輪播図を実現するには、ViewPager+Handlerを使って輪播図の効果を考えます。しかし、RxJavaが急速に発展している場合には、Handlerの代わりにRxJavaを使用してこのようなタスクを完了することができます。
RxJava+Viewer Pagerを実現するためのロードマップを紹介します。
効果図は以下の通りです
ビューPagerの操作
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;
}
}
...
}
以上は比較的によくある輪播図のコードです。ネットで簡単に探しました。まず、コードは、PagerAdapterのgetCount()
を返しました。Integer.MAX_VALUE;
の目的は、画像をずっと再生させるためです。しかし、限界がある場合は、crashがあります。しかも、戻りの数が大きすぎて、メモリに対しても大きな消費をもたらしました。その次に私達はhandlerのコードが極めて複雑であることを見ることができて、多いだけではなくて、ロジックも比較的に面倒です。今は先ほどの問題について最適化します。より良いホイール操作
より良い無限再生:ページカード表示リストを設定すると、前後に各ページカードを追加します。一番前に最後の写真を入れて、一番後ろに1枚目の写真を入れます。そして一番前のページカードに切り替えるたびに、最後から2番目のページカードに置き換えます。最後のページカードに切り替えるたびに、2枚目のページカードに切り替えます。このように一貫して形成され、自然に無限スライドの機能を実現しました。
1)Viewer Pagerのビューリストを設定すると、前後にそれぞれ1ページずつカードを追加します。
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を待ち受けているページカードの状態が変化する中で、1枚目のカードにスライドした時に最後から2枚目のページカードに置き換えます。最後のページのカードにスライドすると、2番目のページのカードに置き換えられます。
@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:
interval(long,TimeUnit)
Javadoc:interval(long,TimeUnit,Scheduler)
インターバルはデフォルトではcomputationスケジューラで実行されます。スケジューラを指定するために、オプションのSchdulerパラメータを送ることもできます。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を交替して、完全にルーニーマップを実現します。以上がこの文章の全部です。本文の内容が皆さんに役に立つことを望んでいます。もし疑問があれば、メッセージを残して交流してもいいです。