像支付宝,淘宝,等等主流APP上,都有会图片轮播这个功能,几张图片能来回滑动,而且还可以自动播放。今天我们就用ViewPager实现这种轮播的效果。假设有三张图片,ViewPager滑动滑到第三张的时候,按正常的逻辑应该滑不动了,无法达到滑到第一张的效果,那么我们该怎么做呢?我们需要分别在左边界和右边界加张图,左边界也就是位置0,放入最后一张图,右边界放入第一张图,这样通过逻辑控制才能达到我们想要的效果,如下图:
好,现在直接上代码:主Activity
package com.example.myapplication;
import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class MainActivity extends Activity {
private ViewPager view_page;
private int pageSize = 4;//广告页的数量,这里设置4
//滑动页面的数量
private List<View> tabViews;//要加载的View数
private LinearLayout dots ;//选到下一张的小点点的容器
private List<ImageView> mVDots;//选到下一张的小点点
private int mPosition = 0 ;
private boolean isSeclect = false ;
private Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
mPosition ++ ;
view_page.setCurrentItem((mPosition),true);
Log.e("setCurrentItem","setCurrentItem====="+mPosition+"");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tabViews = new ArrayList<>();
//初始化数据
view_page = (ViewPager) findViewById(R.id.view_page);
dots = (LinearLayout)findViewById(R.id.dots);
initData();
//设置适配器
view_page.setAdapter(new PagerAdapter() {
@Override
public int getCount() {
return tabViews.size() ;
//tabViews.size();//
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = tabViews.get(position);
container.addView(view);
return view ;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(tabViews.get(position));
}
});
view_page.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
isSeclect = true ;
if (position >pageSize) {//到达右边界,返回到左边1的位置
mPosition = 1;
} else if (position < 1) {//到达左边界,返回最右边的位置
mPosition = pageSize;
} else {
mPosition = position;
}
setCurrentDot(mPosition);
Log.e("position","onPageSelected====="+mPosition+"");
}
@Override
public void onPageScrollStateChanged(int state) {
switch(state)
{
case ViewPager.SCROLL_STATE_DRAGGING://手指滑动的时候
handler.removeMessages(1);//手指滑动,取消延时
Log.e("position","ViewPager.SCROLL_STATE_DRAGGING"+state+"");
break;
case ViewPager.SCROLL_STATE_IDLE://滑动结束,停止在某页
handler.sendEmptyMessageDelayed(1,3000);//重新开始计时
Log.e("position","ViewPager.SCROLL_STATE_IDLE"+state+"");
if(isSeclect)
{
isSeclect = false ;
Log.e("position","onPageScrollStateChanged=====pre"+mPosition+"");
view_page.setCurrentItem(mPosition, false);//当到边界时,重新选择
// handler.sendEmptyMessageDelayed(1,3000);
Log.e("position","onPageScrollStateChanged=====post"+mPosition+"");
}
break;
case ViewPager.SCROLL_STATE_SETTLING://表示手指松开了页面自动滑动
// view_page.setCurrentItem(mPosition, false);
Log.e("position","ViewPager.SCROLL_STATE_SETTLING"+state+"");
break;
}
}
});
view_page.setCurrentItem(1);
handler.sendEmptyMessageDelayed(1,3000);
view_page.setOffscreenPageLimit(tabViews.size());
}
private void initData() {
//引入一个布局,三个共用,设置不同的背景图片
mVDots = new LinkedList<ImageView>();
LayoutInflater tabs = LayoutInflater.from(MainActivity.this);
View tab0 = tabs.inflate(R.layout.tab_01, null);
tab0.setBackgroundResource(R.mipmap.guide_image4);
tabViews.add(tab0);
for(int i = 1 ;i<=pageSize;i++)
{
View tab = tabs.inflate(R.layout.tab_01, null);
//获得相应包下面的资源
int drawble = getResources().getIdentifier("guide_image"+i,"mipmap",this.getPackageName());
tab.setBackgroundResource(drawble);
tabViews.add(tab);
//创建pageSize 个对象,加入到dots容器中
ImageView ivDot = new ImageView(this);
ivDot.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
ivDot.setPadding(5, 5, 5, 5);
ivDot.setImageResource(R.drawable.broadcast_dot);
mVDots.add(ivDot);
dots.addView(ivDot);
}
View tab4 = tabs.inflate(R.layout.tab_01, null);
tab4.setBackgroundResource(R.mipmap.guide_image1);
//添加到列表里
tabViews.add(tab4);
}
private void setCurrentDot(int position) {
/** 界面实际显示的序号是第1、2、 3,而点的序号应该是0、 1、 2,所以减1。 */
position = position - 1;
if (position < 0 || position > pageSize - 1) {
return;
}
for (int i = 0; i < mVDots.size(); i++) {
if (i == position) {
mVDots.get(i).setSelected(true);
} else {
mVDots.get(i).setSelected(false);
}
}
}
}
上面的注释已经很清楚了,最后源码奉上: