Android 广告轮播图

package com.view;

import android.content.Context;
import android.media.Image;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.sgcc.cs.BaseActivity;
import com.sgcc.cs.R;

import java.util.List;


public class CarouselAdLayout extends LinearLayout {
    private Context mContext;
    /*轮播 viewpager*/
    private ViewPager adViewPager;
    /*轮播图片知识*/
    private LinearLayout llPoints;
    /*图片地址*/
    private List<String> imageSource;
    //    private
    /*广告监听*/
    private CarouseAdListener adListener;
    /*存放图片Imageview*/
    private ImageView[] imageViews;
    /*存放图片指示view*/
    private ImageView[] pointViews;
    /*默认指示图片*/
    private int selectImageResource = R.drawable.ads_selected;
    private int unselectImageResorce = R.drawable.ads_unselected;

    /*是否在播放*/
    private boolean isPlay=false;

    public CarouselAdLayout(Context context) {
        super(context);
    }

    public CarouselAdLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        LayoutInflater.from(context).inflate(R.layout.tab_carouse_ad_layout, this);
        adViewPager = (ViewPager) findViewById(R.id.ad_banner);
        adViewPager.setOnPageChangeListener(new CommunicationPageChangeListener());
        llPoints = (LinearLayout) findViewById(R.id.ll_point);

    }

    /**
     * 设置指示图片
     *
     * @param selectImageResource  当前图片指示
     * @param unselectImageResorce 其他图片指示
     */
    private void setPointImageResource(int selectImageResource, int unselectImageResorce) {
        this.selectImageResource = selectImageResource;
        this.unselectImageResorce = unselectImageResorce;

    }

    /**
     * 设置轮播图片
     *
     * @param imageSource
     * @param listener
     */
    public void setImageSource(List<String> imageSource, CarouseAdListener listener) {
        this.imageSource = imageSource;
        this.adListener = listener;
        if (imageSource == null || imageSource.size() == 0)//未传入图片地址
            return;
        imageViews = new ImageView[imageSource.size()];
        pointViews = new ImageView[imageSource.size()];
        llPoints.removeAllViews();
        ImageView adIv;
        for (int i = 0; i < imageSource.size(); i++) {
            adIv = new ImageView(mContext);
            LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            params.setMargins(5, 0, 5, 0);
            adIv.setLayoutParams(params);
//            adIv.setScaleType(ImageView.ScaleType.CENTER_CROP);
            pointViews[i] = adIv;
            if (i == 0)
                adIv.setImageResource(selectImageResource);
            else
                adIv.setImageResource(unselectImageResorce);
            llPoints.addView(adIv);
        }
        MyPagerAdapter adapter = new MyPagerAdapter();
        adViewPager.setAdapter(adapter);
        startCarouseTask();//开始轮播
    }

    /*handler*/
    private Handler handler = new Handler();

    /*当前循环项*/
    private int currentImageIndex = 0;

    /*轮播Task*/
    private Runnable carouseAdTask = new Runnable() {
        @Override
        public void run() {
//            if (++currentImageIndex >= imageSource.size())//最后一张
//                currentImageIndex = 0;
            adViewPager.setCurrentItem(adViewPager.getCurrentItem() + 1);
            if(isPlay)
            handler.postDelayed(carouseAdTask, 3000);

        }
    };

    /*开始轮播*/
    private void startCarouseTask() {

        stopCarouseTask();
        isPlay=true;
        handler.postDelayed(carouseAdTask, 3000);

    }

    /*停止轮播*/

    private void stopCarouseTask() {
        isPlay=false;
        handler.removeCallbacks(carouseAdTask);
    }


    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_UP)
            startCarouseTask();
        else
            stopCarouseTask();
        return super.dispatchTouchEvent(ev);
    }

    /**
     * Viewpager 适配器
     */
    private class MyPagerAdapter extends PagerAdapter {
        private ImageView cacheIv;//被销毁的View 避免重复创建


        @Override
        public int getCount() {//数量
//            return imageSource.size();
            return Integer.MAX_VALUE;//避免最后一张拖动回到第一张
        }


        @Override
        public boolean isViewFromObject(View view, Object object) {//是否由对象生成界面
//            Log.e("msg"," isViewFromObject    "+(view == object));
            return view == object;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {//销毁
            ImageView iv = (ImageView) object;
            adViewPager.removeView(iv);
            cacheIv = iv;//和上面是否可以合成一步
        }

        @Override
        public Object instantiateItem(ViewGroup container, final int position) {//return 一个对象
            ImageView adImageview = null;
            if (cacheIv == null) {//创建View
                adImageview = new ImageView(mContext);
                adImageview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
                adImageview.setAdjustViewBounds(true);
                adImageview.setMaxWidth(((BaseActivity) mContext).getSWidth());
                adImageview.setMaxHeight(((BaseActivity) mContext).getSHeight());
                adImageview.setScaleType(ImageView.ScaleType.CENTER_CROP);
            } else {
                adImageview = cacheIv;
                cacheIv=null;//防止倒滑时复用报错,设置为空
            }

            adImageview.setOnClickListener(new OnClickListener() {//设置监听
                @Override
                public void onClick(View view) {
                    if (adListener != null)
                        adListener.onAdCilck(position % imageSource.size(), imageSource.get(position % imageSource.size()), (ImageView) view);
                }
            });
            adListener.displayImage(adImageview, imageSource.get(position % imageSource.size()));//设置显示图片
            container.addView(adImageview);//添加
            return adImageview;
        }
    }


    private class CommunicationPageChangeListener implements ViewPager.OnPageChangeListener {

        @Override
        public void onPageScrollStateChanged(int arg0) {
//            Log.e("msg","状态改变:"+arg0);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {

        }

        @Override
        public void onPageSelected(int arg0) {
//           Log.e("msg","  onPageSelected" +arg0);
            for (int i = 0; i < pointViews.length; i++) {
                if (i == arg0 % imageSource.size())
                    pointViews[i].setImageResource(selectImageResource);
                else
                    pointViews[i].setImageResource(unselectImageResorce);
            }
        }


    }


    /*轮播图监听*/
    public static interface CarouseAdListener {
        public void onAdCilck(int index, String imgUrl, ImageView view);

        public void displayImage(ImageView iv, String imgUrl);
    }
}

猜你喜欢

转载自blog.csdn.net/u013209460/article/details/51393089