ViewPager 的循環滾動
實現原理:滑動到最後一張的時候,再滑動會到第一次的位置
有兩種實現方式:
1. 將count 設置爲無限大,當前位置設置成Integer.MAXVALUE/2-Integer.MAXVALUE/2%size,使他左右都能滾動
2.不斷循環,用handler發送消息,讓他切換(pager.setCurrentItem(int pos,false);)可以去除調轉到第一張的動畫效果
效果圖如下:
代碼:
package com.lei.vpdemo;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.widget.TextView;
import com.lei.vpdemo.frg.ImageFrg;
public class MainActivity extends FragmentActivity implements
OnPageChangeListener {
private ViewPager mPager;
private TextView mShowTv;
private int[] data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager());
mPager.setAdapter(adapter);
int n = Integer.MAX_VALUE / 2 % data.length;// 2147483647 / 2 = 1073741823
int itemPosition = Integer.MAX_VALUE / 2 - n;
mPager.setCurrentItem(itemPosition);// 選擇第一張處於無限大的位置,以便能作滑
}
private void initView() {
mPager = (ViewPager) findViewById(R.id.viewpager);
mShowTv = (TextView) findViewById(R.id.show_tv);
data = new int[] { R.drawable.earth, R.drawable.sky1, R.drawable.sky2,
R.drawable.sky3, R.drawable.sky4 };
mPager.setOnPageChangeListener(this);
}
// 觸動滑動事件
public void onPageScrollStateChanged(int arg0) {
}
// 滑動: arg0:當前滑動位置position arg1:滑動偏移量
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
// 滑動停止,選中位置position
public void onPageSelected(int arg0) {
mShowTv.setText(String.valueOf(arg0 % data.length));
}
class MyPagerAdapter extends FragmentPagerAdapter {
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int arg0) {
int count = data.length;
return ImageFrg.newInstance(data[arg0 % count]);// 滑動到最後一張,再滑動又加載的第一張圖片
}
@Override
public int getCount() {
return Integer.MAX_VALUE;//
將他的子view設置到無限大,以此實現無限循環
}
}
}