---------------------布局页面----------------------------------------------
android:id=@+id/luck_detail_adv_containerrl
android:layout_width=match_parent
android:layout_height=match_parent >
android:id=@+id/luck_detail_vp
android:layout_width=match_parent
android:layout_height=match_parent
android:background=#ffa1a1a1 />
android:id=@+id/luck_detail_adv_dotll
android:layout_width=match_parent
android:layout_height=wrap_content
android:layout_alignparentbottom=true
android:gravity=center
android:orientation=horizontal
android:paddingbottom=4.5dp
android:paddingtop=4.5dp >
-----------------------------有做修改的autoscrollviewpager------------------------------------
public class autoscrollviewpager extends viewpager {
/**定义页面点击事件*/
public interface onpageitemclicklistener {
void onpageitemclicklistener(t pd);
}
/**滑动时间间距*/
private int mscrolltime = 0;
/**之前位置*/
private int oldindex = 0;
/**当前页面位置*/
private int curindex = 0;
/**图片数据集合*/
private list mpagerdata = new arraylist();
/**适配器*/
private pageradapter pageradapter;
/**图片下面指示小圆点所在布局*/
private linearlayout indicatorview;
/**小圆点状态图片resid*/
private int focuseddrawable, normaldrawable;
private layoutinflater inflater;
private onpageitemclicklistener pageitemclicklistener;
/**是否是假的循环*/
private boolean isfakecycle = false;
/**是否开始滚动*/
private boolean isstartscroll;
/**页面改变监听*/
private pagechangedcallback mcallback;
public interface pagechangedcallback{
void onpagechange(int position);
}
public autoscrollviewpager(context context, attributeset attrs) {
super(context, attrs);
inflater = layoutinflater.from(context);
focuseddrawable = r.drawable.common_dot_selected;
normaldrawable = r.drawable.common_dot_normal;
setinternalpagechangelistener(new onpagechangelistener() {
public void onpageselected(int i) {
if(mcallback!=null)
mcallback.onpagechange(i);
if (mpagerdata.isempty() || indicatorview == null || indicatorview.getchildcount() == 0)
return;
curindex = i % mpagerdata.size();
/**取消圆点选中*/
indicatorview.getchildat(oldindex).setbackgroundresource(normaldrawable);
/**圆点选中*/
indicatorview.getchildat(curindex).setbackgroundresource(focuseddrawable);
oldindex = curindex;
}
public void onpagescrolled(int arg0, float arg1, int arg2) {
}
public void onpagescrollstatechanged(int arg0) {
}
});
/**设置滑动动画时间 ,如果用默认动画时间可不用 ,反射技术实现*/
new fixedspeedscroller(getcontext()).setduration(this, 700);
pageradapter = new mypageradapter();
setadapter(pageradapter);
/**设置预加载数据量,自己设定*/
setoffscreenpagelimit(2);
/**用requestdisallowintercepttouchevent()方法防止viewpager和子view冲突*/
requestdisallowintercepttouchevent(true);
options = new displayimageoptions.builder().showimageonloading(r.drawable.index_advert_default) /**加载过程中默认显示图片*/
.showimageforemptyuri(r.drawable.index_advert_default) /**图片url为空果默认显示图片*/
.showimageonfail(r.drawable.index_advert_default) /**加载错误时默认显示图片*/
.resetviewbeforeloading(false).build();
}
public void setpagechangecallback(pagechangedcallback clallback){
mcallback=clallback;
}
@override
protected void onattachedtowindow() {
super.onattachedtowindow();
if(isstartscroll){
start(mscrolltime);
}
}
@override
protected void ondetachedfromwindow() {
super.ondetachedfromwindow();
if(isstartscroll)
handler.removecallbacksandmessages(null);
}
/** 构建内部索引父view */
private void initinnerindicator() {
indicatorview = new indicatorview(getcontext());
indicatorview.setgravity(gravity.center);
indicatorview.setbackgroundcolor(0x0fff00ff);
indicatorview.setorientation(linearlayout.horizontal);
layoutparams params = new layoutparams();
params.width = viewgroup.layoutparams.match_parent;
params.height = 40;
params.gravity = gravity.bottom;
addview(indicatorview, params);
}
public void setdatas(list imgurls, linearlayout outindicator, boolean needinnerindicator, boolean isfakecycle) {
this.isfakecycle = isfakecycle;
setdatas(imgurls, outindicator, needinnerindicator);
}
/**重复调用可能会anr*/
public void setdatas(list imgurls, linearlayout outindicator, boolean needinnerindicator) {
if (outindicator != null) {
indicatorview = outindicator;
}
else if (needinnerindicator) {
initinnerindicator();
}
mpagerdata.clear();
mpagerdata.addall(imgurls);
pageradapter.notifydatasetchanged();
}
/**重新加载图片数据,刷新vp内容*/
public void refreshdatas(list imgurls, linearlayout outindicator, boolean needinnerindicator,boolean isfakecycle) {
this.isfakecycle = isfakecycle;
if (outindicator != null) {
indicatorview = outindicator;
}
else if (needinnerindicator) {
initinnerindicator();
}
mpagerdata.clear();
mpagerdata.addall(imgurls);
pageradapter = new mypageradapter();
setadapter(pageradapter);
pageradapter.notifydatasetchanged();
}
@override
void datasetchanged() {
super.datasetchanged();
setupindicator();
}
/**设置圆点*/
private void setupindicator() {
if (indicatorview != null) {
indicatorview.removeallviews();
if (mpagerdata.isempty()) {
indicatorview.setvisibility(view.gone);
return;
}
else {
indicatorview.setvisibility(view.visible);
}
for (int i = 0; i view v = inflater.inflate(r.layout.auto_scrollpage_dot, indicatorview, false);
v.setbackgroundresource(normaldrawable);
indicatorview.addview(v);
}
indicatorview.getchildat(0).setbackgroundresource(focuseddrawable);
}
curindex = oldindex = 0;
if (mpagerdata.size() > 1 && isfakecycle) {
setcurrentitem(15 - 15 % mpagerdata.size());
}
else {
setcurrentitem(0);
}
}
/** 获取真实的当前位置 */
public int getcurrentposition() {
return curindex;
}
/** 获取真实的当前位置的数据 */
public t getcurrentdata() throws indexoutofboundsexception {
return mpagerdata.get(curindex);
}
@override
public boolean onintercepttouchevent(motionevent ev) {
if (ev.getaction() == motionevent.action_up || ev.getaction() == motionevent.action_cancel) {
start();
}
else {
handler.removecallbacksandmessages(null);
}
return super.onintercepttouchevent(ev);
}
@override
public boolean ontouchevent(motionevent ev) {
if (ev.getaction() == motionevent.action_up || ev.getaction() == motionevent.action_cancel) {
start();
}
else {
handler.removecallbacksandmessages(null);
}
return super.ontouchevent(ev);
}
/** 开始广告滚动 */
private void start() {
start(mscrolltime);
}
public void start(int scrolltime) {
mscrolltime = scrolltime;
isstartscroll = false;
if (mscrolltime > 0 && !mpagerdata.isempty()) {
isstartscroll = true;
handler.sendmessagedelayed(handler.obtainmessage(), mscrolltime);
}
}
private handler handler = new handler() {
public void handlemessage(android.os.message msg) {
handler.removecallbacksandmessages(null);
if(isfakecycle){
setcurrentitem(getcurrentitem() + 1);
}else{
if(getcurrentitem() == mpagerdata.size()-1){
setcurrentitem(0, true);
}else{
setcurrentitem(getcurrentitem() + 1);
}
}
handler.sendmessagedelayed(handler.obtainmessage(), mscrolltime);
};
};
/**加载网络图片,用到了universal-image-loader开源框架*/
private displayimageoptions options;
public void setimageoptions(displayimageoptions options){
this.options=options;
}
/**viewpager适配器*/
private class mypageradapter extends pageradapter {
@override
public int getcount() {
if (mpagerdata.size() == 1) {
return 1;
}
else if (mpagerdata.size() > 1) {
return isfakecycle ? integer.max_value : mpagerdata.size();
}
return 0;
}
@override
public object instantiateitem(viewgroup container, int position) {
final int realp = position % mpagerdata.size();
final imageview netimgview = (imageview) inflater.inflate(r.layout.auto_scrollpage_img, container, false);
imageloader.getinstance().displayimage(mpagerdata.get(realp).getimageurl(), netimgview, options);
netimgview.setonclicklistener(new view.onclicklistener() {
@override
public void onclick(view v) {
if (pageitemclicklistener != null) {
pageitemclicklistener.onpageitemclicklistener(mpagerdata.get(realp));
}
}
});
container.addview(netimgview);
return netimgview;
}
@override
public void destroyitem(viewgroup container, int position, object object) {
if (object instanceof view) {
container.removeview((view) object);
}
}
@override
public boolean isviewfromobject(view view, object object) {
return view == object;
}
}
/** 设置显示条目的点击事件 */
public void setonpageitemclicklistener(onpageitemclicklistener pageitemclicklistener) {
this.pageitemclicklistener = pageitemclicklistener;
}
}
-----------------内部数据模型,根据需要添加-----------------------------------------
public interface pagerimagedata{
public string getimageurl();/**用于显示网络图片*/
public void setimageurl(string imgurl);
}
--------------------在activity中使用autoscrollviewpager--------------------------------------------------------
/**图片展示,imagebean是项目中用到的请求服务器json数据的实体bean(要继承pagerimagedata) */
private autoscrollviewpager advertisevp;
advertisevp = (autoscrollviewpager) findviewbyid(r.id.luck_detail_vp);
advertisevp.setonpageitemclicklistener(new onpageitemclicklistener() {
@override
public void onpageitemclicklistener(imagebean pd) {
//页面点击事件,做想做的效果(查看大图,跳转到其它地方等)
}
});
/**添加数据imagearray是从服务器取得的图片url集合,也可以自己准备好list imagearray=new arraylist(),往里面加想要的数据*/
advertisevp.refreshdatas(imagearray, (linearlayout) findviewbyid(r.id.luck_detail_adv_dotll), false, true);
advertisevp.start(3000);
activity中的代码没有写全,有时间把项目中用到的整理成个demo上传上去,注意文章中两处红色的地方,我在代码中简写了。