<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span><span style="font-family: Arial, Helvetica, sans-serif; font-size: 14px; background-color: rgb(255, 255, 255);"> 项目中需要用到一个图片轮播的广告,android中自带可以滑动的viewpager. 其中内容的显示都是有adapter来控制的。 所以我们首先要写一个继承自PagerAdapter的类来展示。目前只以显示一个图片为例。代码如下:</span>
public OrderDisplayImageAdapter(Context c, ArrayList<View> views) {
this.views = views;
mContext = c;
advertismentImgList = new ArrayList();
}
public ArrayList<View> getViews() {
return views;
}
public List<String> getAdvertismentImgList() {
return advertismentImgList;
}
public void setAdvertismentImgList(List<String> advertismentImgList) {
this.advertismentImgList = advertismentImgList;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
if (views == null) {
return 0;
}
/**
* 设置成最大是为了实现类似循环播放的功能
*/
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;// 它用于判断你当前要显示的页面
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
if (views == null || views.size() == 0)
return null;
final int positionFact = position % views.size();
if (advertismentImgList.size() == 0) {
ImageLoader.getInstance().displayImage(null,
(ImageView) views.get(positionFact), options);
} else {
ImageLoader.getInstance().displayImage(
advertismentImgList.get(positionFact),
(ImageView) views.get(positionFact), options);
}
View view = views.get(positionFact);
//如果View已经在之前添加到了一个父组件,则必须先remove,否则会抛出IllegalStateException。
ViewParent vp = view.getParent();
if (vp != null) {
ViewGroup parent = (ViewGroup) vp;
parent.removeView(view);
}
container.addView(view);
views.get(positionFact).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//可以添加点击事件
}
});
return views.get(positionFact);
}
这里有几个地方需要注意下:
1 getCount()函数返回最大的整数是为了实现类似轮播的效果否则viewpager是有边界的,里面应该之后几个元素,到达边界就没 有办法继续滑动。
2 final int positionFact = position % views.size();这个地方必须是有取余方法,因为返回的是最大整数,而我们的内容肯定么有那 么多的。
3 addview进入的一定要remove掉。parent.removeView(view);这个地方。
这样展示的内容就写好了。接着就要写viewpager的东西了,因为有的需要viewpager自动滑动,那么这个时候就需要handler来实现这个功能,通过发送消息的方式,使viewpager自动选择下一页,这个时候一定要处理好手势滑动和自动滑动消息发送,否则造成多次手势滑动和自动滑动之后表示底部显示位置的小白点错误。直接上代码:
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_UPDATE_IMAGE:
/*
* 更新位置
*/
if (displayAdapter != null
&& displayAdapter.getAdvertismentImgList() != null
&& displayAdapter.getAdvertismentImgList().size() > 1) {
mViewPager.setCurrentItem(pointPosition + 1);
}
break;
default:
break;
}
}
};
负责图片更换位置。
mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
// // 下标为 position 的页面已完成装载时将调用此方法
if (pointLayout != null) {
int size = pointLayout.getChildCount();
if (size != 0) {
int position = arg0 % size;
pointLayout.getChildAt(position).setEnabled(false);
if (-1 != pointPosition) {
int lastPos = pointPosition % size;
pointLayout.getChildAt(lastPos).setEnabled(true);
}
}
}
pointPosition = arg0;
//如果滑动的时候发现之前已经收到更新位置的消息,那么就说明已经手势滑动了,
//那么就需要删除原来的消息否则会导致显示位置错误。
if (mHandler.hasMessages(MSG_UPDATE_IMAGE)) {
mHandler.removeMessages(MSG_UPDATE_IMAGE);
}
if (isNeedDisplay) {
//页面退出之后不再发送消息去更新位置
Message msg = mHandler.obtainMessage();
msg.what = MSG_UPDATE_IMAGE;
msg.obj = arg0 + 1;
mHandler.sendMessageDelayed(msg, MSG_DELAY);
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
// 当页面的状态改变时将调用此方法
switch (arg0) {
case ViewPager.SCROLL_STATE_DRAGGING:
break;
case ViewPager.SCROLL_STATE_IDLE:
break;
default:
break;
}
}
});
这个负责处理viewpager更新位置之后的操作。这个地方需要注意的是收拾滑动和自动滑动都会导致更新下一个位置的message,这个要处理好他们在队列中的唯一性。在代码注释中已经写好。同时如果不需要手势滑动,那么我们可以写一个继承自viewpager的类自己把滑动屏蔽掉。 代码如下:
/**
* 设置viewpager是否滑动
*/
private boolean isCanScroll = true;
public IndexViewPager(Context context) {
super(context);
}
public IndexViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setScanScroll(boolean isCanScroll) {
this.isCanScroll = isCanScroll;
}
@Override
public void scrollTo(int x, int y) {
super.scrollTo(x, y);
}
//取消滑动
@Override
public boolean onTouchEvent(MotionEvent arg0) {
if(isCanScroll){
return super.onTouchEvent(arg0);
}else{
return false;
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
if(isCanScroll){
return super.onInterceptTouchEvent(arg0);
}else{
return false;
}
}
效果图如下。我不会上传动态图只能上传一个静态的了,
最后附上全部源码地址:点击打开链接