您的位置:首页 > 移动开发 > Android开发

android广告轮播(循环滑动,定时滑动,动态加载indicator)

2016-05-10 10:29 429 查看
首先来看看我的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v4.view.ViewPager
android:id="@+id/vp_carousel_picture"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<LinearLayout
android:id="@+id/ll_indicator"
android:gravity="center"
android:background="#66000000"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_alignParentBottom="true"
>
</LinearLayout>
</RelativeLayout>


然后在创建holder,把布局加载进去:

public class CarouselHolder extends BaseHolder<List<HomeHeaderModel.DataBean.AdvertListBean>>implements ViewPager.OnPageChangeListener {
private ViewPager vp_carousel_picture;
private List<HomeHeaderModel.DataBean.AdvertListBean> datas;
private View view;
boolean flag;
private AuToRunTask runTask;
private List<ImageView> mIndicator;
private LinearLayout ll_indicator;

/**
* 创建界面
*/
@Override
public View initView() {
view=View.inflate(Tools.getContext(),R.layout.carousel_picture,null);
vp_carousel_picture=(ViewPager)view.findViewById(R.id.vp_carousel_picture);
ll_indicator=(LinearLayout)view.findViewById(R.id.ll_indicator);
return view;
}

/**
* 根据数据刷新界面
*
* @param data
*/
@Override
public void refreshView(List<HomeHeaderModel.DataBean.AdvertListBean> data) {
datas = data;
initIndicator();

vp_carousel_picture.setAdapter(new CarouselAdapter());
setIndicator(0);
vp_carousel_picture.setCurrentItem(2000 * datas.size());// 设置起始的位置   Integer.Max_Vlue/2
vp_carousel_picture.setOnTouchListener(new View.OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
runTask.stop();
break;
case MotionEvent.ACTION_CANCEL:  // 事件的取消
case MotionEvent.ACTION_UP:
runTask.start();
break;
}
return false; // viewPager 触摸事件 返回值要是false
}
});
runTask = new AuToRunTask();
runTask.start();
vp_carousel_picture.setOnPageChangeListener(this);

}

/**
* 初始化小圆点
*/
private void initIndicator() {
mIndicator =new ArrayList<ImageView>();
for (int i=0;i<datas.size();i++){
ImageView img=new ImageView(Tools.getContext());
LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(Tools.getDimens(R.dimen.indicator_height),Tools.getDimens(R.dimen.indicator_height));
params.setMargins(10,0,0,0);
img.setLayoutParams(params);
img.setImageResource(R.drawable.shape_point_red);
ll_indicator.addView(img);
mIndicator.add(img);
}
}

private class CarouselAdapter extends PagerAdapter{

// 当前viewPager里面有多少个条目
LinkedList<SimpleDraweeView> convertView=new LinkedList<SimpleDraweeView>();
@Override
public int getCount() {
return Integer.MAX_VALUE;
}

@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
SimpleDraweeView view=(SimpleDraweeView) object;
convertView.add(view);// 把移除的对象 添加到缓存集合中
container.removeView(view);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
int index=position%datas.size();
SimpleDraweeView view;
if(convertView.size()>0){
view=convertView.remove(0);
}else{
view= new SimpleDraweeView(Tools.getContext());
}
FrescoTool.loadImage(view, Constants.ImageResource.BASE_AD_URL + datas.get(index).getPath());
container.addView(view); // 加载的view对象
return view; // 返回的对象
}
}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

@Override
public void onPageSelected(int position) {setIndicator(position);}

@Override
public void onPageScrollStateChanged(int state) {}

/**
* 根据viewpager的position设置小圆点的位置
* @param position
*/
private void setIndicator(int position) {
position %= datas.size();
//遍历mIndicator重置src为normal
for (ImageView indicator : mIndicator){
indicator.setImageResource(R.drawable.shape_point_gray);
}
mIndicator.get(position).setImageResource(R.drawable.shape_point_red);
}

public class AuToRunTask implements Runnable{
@Override
public void run() {
if(flag){
Tools.cancel(this);  // 取消之前
int currentItem = vp_carousel_picture.getCurrentItem();
currentItem++;
vp_carousel_picture.setCurrentItem(currentItem);
//  延迟执行当前的任务
Tools.postDelayed(this, 2000);// 递归调用
}
}
public void start(){
if(!flag){
Tools.cancel(this);  // 取消之前
flag=true;
Tools.postDelayed(this, 2000);// 递归调用
}
}
public  void stop(){
if(flag){
flag=false;
Tools.cancel(this);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: