别人都说使用ViewPager轮播很简单,但还是需要自己手动来操作下。顺便总结下实现无限循环轮播的思路。
要使用ViewPager实现无限循环播放的轮播,会涉及到以下知识点:
1、ViewPager的使用
2、怎样实现无限循环?
3、怎样实现自动播放?
1、ViewPager的应用
ViewPager应用很简单,只需使用android.support.v4.view.ViewPager组件即可,同ListView一样,需要给它指定一个适配器。
四大函数略。
2、实现无限循环
当banner位于1屏,向左滑动,此时位于最后一屏,
当banner位于最后一屏,向右滑动,此时位于第一屏。
private class BannerAdapter extends PagerAdapter{
private LayoutInflater mInflater;
public BannerAdapter(Context context){
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return Max_Size;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
position %= Default_Size;
View view = mInflater.inflate(R.layout.item, container,false);
ImageView imageView = (ImageView) view.findViewById(R.id.image);
imageView.setImageResource(mImageSrc[position]);
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public void finishUpdate(ViewGroup container) {
//获取当前banner的索引
int position = mBanner.getCurrentItem();
//屏幕0切换为屏幕3
if (position == 0){
currentPosition = Default_Size;
//banner设置当前索引
mBanner.setCurrentItem(currentPosition, false);
}
//当下标达到99时,将其切换到第2屏
else if (position == Max_Size-1){
currentPosition = Default_Size-1;
mBanner.setCurrentItem(currentPosition, false);
}
super.finishUpdate(container);
}
}
三、实现自动播放
private Handler mHandler = new Handler();
private long lasttime;
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if (System.currentTimeMillis() -lasttime>3000){
currentPosition++;
viewHandler.sendEmptyMessage(currentPosition);
lasttime = System.currentTimeMillis();
}
mHandler.postDelayed(mRunnable, 3000);
}
};
完整代码:
public class MainActivity extends Activity {
private ViewPager mBanner;
private ImageView[] mPositionViews;
private BannerAdapter mAdapter;
private int currentPosition = 0;
private final int Max_Size = 100;
private final int Default_Size =3;
private int[] mImageSrc = {
R.drawable.img1,
R.drawable.img2,
R.drawable.img3
};
private Handler mHandler = new Handler();
private long lasttime;
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if (System.currentTimeMillis() -lasttime>3000){
currentPosition++;
viewHandler.sendEmptyMessage(currentPosition);
lasttime = System.currentTimeMillis();
}
mHandler.postDelayed(mRunnable, 3000);
}
};
private Handler viewHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
mBanner.setCurrentItem(msg.what);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
init();
}
private void setBannerPosition(int position){
position %= Default_Size;
for (ImageView imageView:mPositionViews){
imageView.setImageResource(R.drawable.indicator_unchecked);
}
mPositionViews[position].setImageResource(R.drawable.indicator_checked);
}
private void init() {
mPositionViews = new ImageView[]{
(ImageView) findViewById(R.id.position_1),
(ImageView) findViewById(R.id.position_2),
(ImageView) findViewById(R.id.position_3),
};
mBanner = (ViewPager) findViewById(R.id.banner);
mAdapter = new BannerAdapter(this);
mBanner.setAdapter(mAdapter);
mHandler.postDelayed(mRunnable, 3000);
mBanner.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
currentPosition = arg0;
setBannerPosition(currentPosition);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
private class BannerAdapter extends PagerAdapter{
private LayoutInflater mInflater;
public BannerAdapter(Context context){
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return Max_Size;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
position %= Default_Size;
View view = mInflater.inflate(R.layout.item, container,false);
ImageView imageView = (ImageView) view.findViewById(R.id.image);
imageView.setImageResource(mImageSrc[position]);
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public void finishUpdate(ViewGroup container) {
//获取当前banner的索引
int position = mBanner.getCurrentItem();
//屏幕0切换为屏幕3
if (position == 0){
currentPosition = Default_Size;
//banner设置当前索引
mBanner.setCurrentItem(currentPosition, false);
}
//当下标达到99时,将其切换到第2屏
else if (position == Max_Size-1){
currentPosition = Default_Size-1;
mBanner.setCurrentItem(currentPosition, false);
}
super.finishUpdate(container);
}
}
}