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

首先来看看我的布局:

<?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);
            }
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值