無限循環,自動滾動,兼容PageIndicator的ViewPager

package cn.news.bz.widget;android


import android.content.Context;數組

import android.support.v4.view.PagerAdapter;ide

import android.support.v4.view.ViewPager;post

import android.util.AttributeSet;this

import android.view.MotionEvent;.net

import android.view.View;索引

import android.view.ViewGroup;事件


/**get

 * 頂部ViewPager 自動滾動以及無限循環滾動it

 * 

 * @author Mr_wu

 * @mail 97046335@qq.com

 */

public class HeadViewPager extends ViewPager implements Runnable {


    private PagerAdapter pagerAdapter;


    private static final int POST_DELAYED_TIME = 1000 * 10;

    // 手指是否放在上面

    private boolean touching;


    private PagerAdapter myPagerAdapter;


    public HeadViewPager(Context context, AttributeSet attrs) {

        super(context, attrs);

        postDelayed(this, POST_DELAYED_TIME);

    }


    // 對setAdapter的數據進行包裝

    private class MyPagerAdapter extends PagerAdapter {

        private PagerAdapter pa;


        public MyPagerAdapter(PagerAdapter pa) {

            this.pa = pa;

        }


        @Override

        // 關鍵之一:修改Count長度

        public int getCount() {

            return pa.getCount() > 1 ? pa.getCount() + 2 : pa.getCount();

        }


        @Override

        // 這裏是關鍵之二:修改索引(若是不考慮內容問題能夠所有加載進數組而後操做更簡單)

        public Object instantiateItem(ViewGroup container, int position) {


            if (position == 0) {

                return pa.instantiateItem(container, pa.getCount() - 1);

            } else if (position == pa.getCount() + 1) {

                return pa.instantiateItem(container, 0);

            } else {

                return pa.instantiateItem(container, position - 1);

            }

        }


        @Override

        public void destroyItem(ViewGroup container, int position, Object object) {

            pa.destroyItem(container, position, object);

        }


        @Override

        public boolean isViewFromObject(View arg0, Object arg1) {

            return pa.isViewFromObject(arg0, arg1);

        }


        public int getItemPosition(Object object) {

            return POSITION_NONE;

        }

    }


    // 包裝setOnPageChangeListener的數據

    private class MyOnPageChangeListener implements OnPageChangeListener {

        private OnPageChangeListener listener;

        // 是否已經提早觸發了OnPageSelected事件

        private boolean alreadyTriggerOnPageSelected;


        public MyOnPageChangeListener(OnPageChangeListener listener) {

            this.listener = listener;

        }


        @Override

        // 關鍵之三:

        public void onPageScrollStateChanged(int arg0) {

            if (arg0 == SCROLL_STATE_IDLE) {

                if (getCurrentItem() + 1 == 0) {

                    setCurrentItem(pagerAdapter.getCount() - 1, false);

                } else if (getCurrentItem() + 1 == pagerAdapter.getCount() + 1) {

                    setCurrentItem(0, false);

                }

            }


            listener.onPageScrollStateChanged(arg0);

        }


        @Override

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

            listener.onPageScrolled(arg0, arg1, arg2);

        }


        @Override

        // 關鍵四:

        public void onPageSelected(int arg0) {

            if (arg0 == 0) {

                listener.onPageSelected(pagerAdapter.getCount() - 1);

                alreadyTriggerOnPageSelected = true;

            } else if (arg0 == pagerAdapter.getCount() + 1) {

                listener.onPageSelected(0);

                alreadyTriggerOnPageSelected = true;

            } else {

                if (!alreadyTriggerOnPageSelected) {

                    listener.onPageSelected(arg0 - 1);

                }

                alreadyTriggerOnPageSelected = false;

            }


        }


    }


    @Override

    public void setOnPageChangeListener(OnPageChangeListener listener) {

        super.setOnPageChangeListener(listener == null ? null : new MyOnPageChangeListener(listener));

    }


    @Override

    public void setAdapter(PagerAdapter arg0) {

        myPagerAdapter = arg0 == null ? null : new MyPagerAdapter(arg0);

        super.setAdapter(myPagerAdapter);


        if (arg0 != null && arg0.getCount() != 0) {

            setCurrentItem(0, false);

        }

        this.pagerAdapter = arg0;

    }


    @Override

    // 兼容PageIndicator

    public PagerAdapter getAdapter() {

        return pagerAdapter;

    }


    public PagerAdapter getMyPagerAdapter() {

        return myPagerAdapter;

    }


    @Override

    public int getCurrentItem() {

        return super.getCurrentItem() - 1;

    }


    @Override

    public void setCurrentItem(int item) {

        setCurrentItem(item, true);

    }


    @Override

    public void setCurrentItem(int item, boolean smoothScroll) {

        super.setCurrentItem(item + 1, smoothScroll);

    }


    @Override

    // 自動滾動關鍵

    public void run() {

        if (getAdapter() != null && getAdapter().getCount() > 1 && !touching) {

            setCurrentItem(getCurrentItem() + 1, true);

        }

        postDelayed(this, POST_DELAYED_TIME);

    }


    @Override

    public boolean onTouchEvent(MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_DOWN) {

            this.touching = true;

        } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) {

            this.touching = false;

        }


        return super.onTouchEvent(event);

    }

}

相關文章
相關標籤/搜索