Androidはviewpagerを使って無限ループを実現します(タイミング+手動)
循環輪放送の方法は二つあります。一つはタイマーを使うことともう一つは指を使って動かすことです。比較的に、タイマーが循環再生を実現するのは比較的に簡単です。タイマーのメッセージはリガで簡単なコードだけでいいです。以下はこの二つの方法について詳しく説明します。詳しくは以下をご覧ください。
おかしいのはアダプターの中で設定数が最大値です。そして、現在の位置では、中間の値、例えば、
大量の資料を見ることによって、Viewer Pager自身は左右無限循環の機能をサポートしていないことが分かりました。これは本当に失敗しました。
Viewer Pager自身が支持しないため、私達は自分で方法を探すしかないです。以下は私が左右の無限循環を実現する方法です。
表示のためのmViewsは、データソースmListよりも多く、2つのノード要素(先頭ノード0:bとエンドノード5:eはジャンプ用)があります。
下の図の矢印なしの赤い線は、mViewがmListから初期化した場合です。矢印のある赤い糸がジャンプする場合です。
具体的なコードは以下の通りです。
int count = adapter.getCount();
if (count > 1) { // 1 ,
int index = viewPager.getCurrentItem();
index = (index + 1) % count;
viewPager.setCurrentItem(index, true);
}
どのように指を動かす時にも、左右の無限ループの機能がサポートされますか?この問題は長い間苦労しました。インターネットの資料は多く使えません。おかしいのはアダプターの中で設定数が最大値です。そして、現在の位置では、中間の値、例えば、
public class MyAdapter extends PagerAdapter{
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager)container).removeView(mImageViews[position % count]);
}
public Object instantiateItem(View container, int position) {
View view = mImageViews[position % count];
((ViewPager)container).addView(view, 0);
return view;
}
}
protected void onCreate(Bundle savedInstanceState) {
viewPager.setAdapter(new MyAdapter());
// ViewPager , 100 ,
viewPager.setCurrentItem(count * 100);
}
このようなやり方は、実際には左右無限の循環に達していません。ただ、一般的には境界(スライド不可)に到達するのが難しい場合があります。大量の資料を見ることによって、Viewer Pager自身は左右無限循環の機能をサポートしていないことが分かりました。これは本当に失敗しました。
Viewer Pager自身が支持しないため、私達は自分で方法を探すしかないです。以下は私が左右の無限循環を実現する方法です。
表示のためのmViewsは、データソースmListよりも多く、2つのノード要素(先頭ノード0:bとエンドノード5:eはジャンプ用)があります。
下の図の矢印なしの赤い線は、mViewがmListから初期化した場合です。矢印のある赤い糸がジャンプする場合です。
具体的なコードは以下の通りです。
public class AdapterCycle extends PagerAdapter
implements ViewPager.OnPageChangeListener{
private Context mContext; //
private LayoutInflater mInflater; // XML
private LinkedList<View> mViews; // <span style="font-family: Arial, Helvetica, sans-serif;"> </span><span style="font-family: Arial, Helvetica, sans-serif;"> View</span>
private List<Drawable> mList; // <span style="font-family: Arial, Helvetica, sans-serif;">Drawable</span>
private ViewPager mViewPager; //
public AdapterCycle(Context context, ViewPager viewPager,
List<Drawable> list)
{
mContext = context;
mInflater = LayoutInflater.from(context);
mViewPager = viewPager;
if (list != null) {
// 1 , (index:0)
mViews = new LinkedList<View>();
ImageView view = (ImageView) mInflater.inflate(
R.layout.activity_main_item_cycle, null);
Drawable drawable = list.get(list.size() - 1);
view.setImageDrawable(drawable);
mViews.add(view);
// , 1 ,mViews mList ( )
// :mList mList[0~N-1], mViews mViews[0~N+1]
// mViews[0] mList[N-1], mViews[i] mList[i-1], mViews[N+1] mList[0]
// mViews[1~N] ; mViews[0] mViews[N+1]
// mViews[0], (N); mViews[N+1], (1)
if( list.size() > 1) { // 1
for (Drawable d : list) { // N (index:1~N)
ImageView v = (ImageView) mInflater.inflate(
R.layout.activity_main_item_cycle, null);
v.setImageDrawable(d);
mViews.add(v);
}
// (index:N+1)
view = (ImageView) mInflater.inflate(
R.layout.activity_main_item_cycle, null);
drawable = dList.get(0);
view.setImageDrawable(drawable);
mViews.add(view);
}
}
}
@Override
public int getCount() {
return mViews.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView(mViews.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = mViews.get(position);
container.addView(view);
return view;
}
// ViewPager.OnPageChangeListener
@Override
public void onPageSelected(int position) {
LogUtils.logi(TAG, "onPageSelected:" + position);
if ( mViews.size() > 1) { // 1,
if ( position < 1) { // , (N)
position = mList.size(); // mList, mViews
mViewPager.setCurrentItem(position, false);
} else if ( position > mList.size()) { // , (1)
mViewPager.setCurrentItem(1, false); //false:
position = 1;
}
}
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
//
}
@Override
public void onPageScrollStateChanged(int state) {
//
}
}
// , mViewPager 1
if (mAdapterCycle.getCount() > 1) { // 1 ,
mViewPager.setCurrentItem(1); // mViewPager 1
startTimer(); // ,
}
この時、タイマーを利用して、循環輪放送を実現するには、次のように修正する必要があります。
int count = adapter.getCount();
if (count > 2) { // , 1 , 3
int index = viewPager.getCurrentItem();
index = index % (count - 2) + 1; //
viewPager.setCurrentItem(index, true);
}