Banner无限轮播

Banner 无限轮播

public class BannerViewPager extends FrameLayout implements View.OnClickListener {

    private ItemClickListener itemClickListener;
    /**
     * 图片内容
     */
    private List<HomeData.BannerData> mList;
    /**
     * View
     */
    private List<View> mViews;
    /**
     * 下标
     */
    private List<ImageView> mImgs;
    /**
     * 延迟时间
     */
    private long delaytime;

    /**
     * 是否自动滚动
     */
    private boolean isAuto;
    private Handler mHandle;
    private int currentItem;
    private LazyViewPager vp;
    private Context mContext;

    public BannerViewPager(Context context) {
        this(context, null);
    }

    public BannerViewPager(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BannerViewPager(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.mContext = context;
        initViews();
    }

    private void initViews() {
        mViews = new ArrayList<>();
        mImgs = new ArrayList<>();
        mHandle = new Handler(mContext.getMainLooper());
        delaytime = 3000;
    }


    public void setData(List<HomeData.BannerData> lists) {
        this.mList = lists;
        mImgs.clear();
        mViews.clear();
        initDatas();
    }

    public List<HomeData.BannerData> getData(){
        return mList;
    }

    @Override
    protected void onWindowVisibilityChanged(int visibility) {
        super.onWindowVisibilityChanged(visibility);
        switch (visibility) {
            case View.VISIBLE:
                Log.d("yu", "vis");
                isAuto = true;
                break;
            default:
                Log.d("yu", "default :  " + visibility);
                isAuto = false;
                break;
        }
    }

    private void initDatas() {
        int length = mList.size();
        View view = LayoutInflater.from(mContext).inflate(R.layout.banner_view, this, true);
        LinearLayout ll = (LinearLayout) view.findViewById(R.id.ll_points);
        vp = (LazyViewPager) view.findViewById(R.id.vp);
        ll.removeAllViews();
        LinearLayout.LayoutParams ll_parmas = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        ll_parmas.leftMargin = 5;
        ll_parmas.rightMargin = 5;
        for (int i = 0; i < length; i++) {
            ImageView img = new ImageView(mContext);
            img.setLayoutParams(ll_parmas);
            if (i == 0) {
                img.setImageResource(R.mipmap.page_indicator_focused);
            } else {
                img.setImageResource(R.mipmap.page_indicator_unfocused);
            }
            ll.addView(img);
            mImgs.add(img);

            final ImageView imgforview = new ImageView(mContext);
            imgforview.setOnClickListener(this);
            imgforview.setScaleType(ImageView.ScaleType.FIT_XY);
            LogUtil.e("首页banner:",HttpURL.ISGO_HTTP_BITMAP_BASE + mList.get(i).imgUrlApp);
            Glide.with(mContext).load(HttpURL.ISGO_HTTP_BITMAP_BASE + mList.get(i).imgUrlApp).placeholder(R.mipmap.example).into(imgforview);
            mViews.add(imgforview);
        }

        vp.setAdapter(new MyAdapter());

        if(mViews.size() <= 1){
            isAuto = false;
        }else{
            vp.setOnPageChangeListener(onPageChange);
            isAuto = true;
            mHandle.postDelayed(task, delaytime);
        }


    }


    private Runnable task = new Runnable() {
        @Override
        public void run() {
            if (isAuto) {
                if (currentItem == 0) {
                    vp.setCurrentItem(currentItem, false);
                } else {
                    vp.setCurrentItem(currentItem);
                }
                currentItem++;
                mHandle.postDelayed(task, delaytime);
            } else {
                mHandle.postDelayed(task, delaytime);
            }
        }
    };


    private int preposition;
    private LazyViewPager.OnPageChangeListener onPageChange = new LazyViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            currentItem = vp.getCurrentItem();
            position = position % mViews.size();
            if (position == preposition) {
                mImgs.get(position).setImageResource(R.mipmap.page_indicator_focused);
            } else {
                mImgs.get(position).setImageResource(R.mipmap.page_indicator_focused);
                mImgs.get(preposition).setImageResource(R.mipmap.page_indicator_unfocused);
            }
            preposition = position;
        }

        @Override
        public void onPageScrollStateChanged(int state) {

            switch (state) {
                case LazyViewPager.SCROLL_STATE_IDLE://用户什么都没有操作
//                    isAuto=true;

                    break;
                case LazyViewPager.SCROLL_STATE_DRAGGING://正在滑动
                    isAuto = false;
                    break;
                case LazyViewPager.SCROLL_STATE_SETTLING://滑动结束
                    isAuto = true;
                    break;

            }
        }
    };

    public void setItemClickListener(ItemClickListener listener) {
        this.itemClickListener = listener;
    }

    public interface ItemClickListener {
        void click(View view, HomeData.BannerData bean, int position);
    }

    @Override
    public void onClick(View v) {
        if (itemClickListener != null) {
            int currentItem = vp.getCurrentItem() % mViews.size();
            itemClickListener.click(v, mList.get(currentItem), currentItem);
        }

    }

    private class MyAdapter extends PagerAdapter {

        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

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

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            position = position % mViews.size();
            if (mViews.get(position).getParent() != null) {
                ((LazyViewPager) mViews.get(position).getParent()).removeView(mViews.get(position));
            }
            ((LazyViewPager) container).addView(mViews.get(position), 0);
            return mViews.get(position);

        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    }


    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                isAuto = false;
                break;
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:
                isAuto = true;
                break;
        }
        return super.dispatchTouchEvent(ev);
    }

}

banner_view.xml:

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

    <android.support.v4.view.ViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/background">
    </android.support.v4.view.ViewPager>
    <LinearLayout
        android:id="@+id/ll_points"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:gravity="center_horizontal"
        android:orientation="horizontal"
        android:padding="8dip">

    </LinearLayout>
</merge>

调用: mViewPager.setData(datas);即可

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值