zoukankan      html  css  js  c++  java
  • Android 轮播

    import android.app.Activity;
    import android.content.Context;
    import android.support.annotation.Nullable;
    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.RelativeLayout;
    
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class Carousel extends RelativeLayout {
    
        private CarouselPager mPager;
        private Context mContext;
        private int mResourceId = -1;
        private Carousel self;
        private CarouselDelegate mDelegate;
        private CarouselAdapter mAdapter;
        private int mCurrentItem = 1;
        private int mItemCount;
    
        public Carousel(Context context) {
            super(context);
            init(context);
        }
    
        public Carousel(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            init(context);
        }
    
        public Carousel(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init(context);
        }
    
        private void init(Context context) {
            mContext = context;
            self = this;
    
            mAdapter = new CarouselAdapter();
    
            mPager = new CarouselPager(mContext);
            RelativeLayout.LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
            addView(mPager,layoutParams);
    
            mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
                }
    
                @Override
                public void onPageSelected(int position) {
    
    //                Log.d("Selected", "onPageSelected: " + position);
                    mCurrentItem = position;
                    int display_index = mCurrentItem;
                    if (position == 0) {
                        display_index = mItemCount;
                    } else if (position == mItemCount + 1) {
                        display_index = 1;
                    } else {
                        display_index = position;
    
                        // 代理方法在此调用避免两端点的索引重复出现
                        if (mDelegate != null) {
                            mDelegate.carouselDidShowItem(self,display_index - 1);
                        }
                    }
    
    
                }
    
                @Override
                public void onPageScrollStateChanged(int state) {
    
                    // 解决两端切换时闪屏
                    if (state == ViewPager.SCROLL_STATE_IDLE) {
                        if (mCurrentItem == mPager.getAdapter().getCount() - 1) {
                            mPager.setCurrentItem(1, false);
                        }
                        else if (mCurrentItem == 0) {
                            mPager.setCurrentItem(mPager.getAdapter().getCount() - 2, false);
                        }
                    }
                }
            });
            mPager.setAdapter(mAdapter);
            reloadData();
        }
    
        public void registResourceId(int resourceId) {
            mResourceId = resourceId;
        }
    
        public void setDelegate(CarouselDelegate delegate) {
            mDelegate = delegate;
        }
    
        public void reloadData() {
            mAdapter.notifyDataSetChanged();
            mCurrentItem = 1;
            mPager.setCurrentItem(mCurrentItem,false);
            if (mAutoScroll) {
    
                startAutoScroll();
            }
        }
    
    
    
        public interface CarouselDelegate {
    
            void carouselWillShowItem(Carousel carousel,View cell,int index);
            void carouselDidShowItem(Carousel carousel,int index);
            int  carouselNumberOfItems(Carousel carousel);
    
        }
    
        public class CarouselAdapter extends PagerAdapter {
    
            ArrayList<View> mReusePool = new ArrayList<>();
    
            @Override
            public int getCount() {
                if (mDelegate == null || mResourceId == -1) {
    
                    return mItemCount = 0;
                } else {
                    int number = mDelegate.carouselNumberOfItems(self);
                    if (number == 0) {
                        return mItemCount = 0;
                    } else {
                        mItemCount = number;
                        return number + 2;
                    }
                }
    
            }
    
            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }
    
            @Override
            public int getItemPosition(Object object) {
    //            return super.getItemPosition(object);
                return POSITION_NONE; // 解决notifyDataChange后界面没更新
            }
    
            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
    
                View cell = (View) object;
                container.removeView(cell);
                mReusePool.add(cell);
            }
    
            @Override
            public Object instantiateItem(ViewGroup container, int position) {
    
                View cell = null;
                if (mReusePool.isEmpty()) {
    
                    cell = (View) LayoutInflater.from(mContext).inflate(mResourceId,null);
    
                } else {
                    cell = mReusePool.get(0);
                    mReusePool.remove(cell);
                }
    
    
                int index = position;
                if (position == 0) {
                    index = mItemCount - 1;
                } else if (position == mItemCount + 1) {
                    index = 0;
                } else {
                    index = position - 1;
                }
    
    
                if (mDelegate!= null) {
                    mDelegate.carouselWillShowItem(self,cell,index);
                }
    
                container.addView(cell);
    
                return cell;
            }
        }
    
        private Timer mTimer;
        private TimerTask mTimerTask;
        private boolean mAutoScroll = false;
        private int mAutoScrollFlag = 0; // Timer开始第一次执行无效
        private int mScrollTimeInterval = 10; // 单位秒
    
        public void setAutoScroll(boolean autoScroll) {
            mAutoScroll = autoScroll;
            if (mAutoScroll) {
                startAutoScroll();
            } else {
                stopAutoScroll();
            }
        }
    
        public boolean getAutoScroll() {
            return mAutoScroll;
        }
    
        public void setScrollTimeInterval(int scrollTimeInterval) {
            this.mScrollTimeInterval = scrollTimeInterval;
        }
    
        public int getScrollTimeInterval() {
            return this.mScrollTimeInterval;
        }
    
        private void startAutoScroll() {
            if (mItemCount == 0) {
                return;
            }
    
            stopAutoScroll();
    
            mTimer = new Timer();
            mTimerTask = new TimerTask() {
                @Override
                public void run() {
                    ((Activity)mContext).runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if (mAutoScrollFlag == 0) {
                                mAutoScrollFlag = 1;
                            } else {
                                mPager.setCurrentItem(mCurrentItem + 1,true);
                            }
                        }
                    });
                }
            };
            mTimer.schedule(mTimerTask,new Date(),1000 * mScrollTimeInterval);
        }
    
        private void stopAutoScroll() {
            if (mTimer != null) {
                mTimer.cancel();
                mTimer = null;
                mTimerTask = null;
                mAutoScrollFlag = 0;
            }
        }
    
        private class CarouselPager extends ViewPager {
    
            public CarouselPager(Context context) {
                super(context);
            }
    
            public CarouselPager(Context context, AttributeSet attrs) {
                super(context, attrs);
            }
    
            @Override
            public boolean onTouchEvent(MotionEvent event) {
    
                if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {
                    stopAutoScroll();
                }
    
                if (event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_UP) {
                    if (mAutoScroll) {
                        startAutoScroll();
                    }
                }
    
                return super.onTouchEvent(event);
            }
        }
    }
  • 相关阅读:
    yum管理工具
    ansible简介,简单实用
    ssh服务简介及应用与服务的进程的类型
    keepliave
    NFS
    编译安装redis4.0
    redis多实例和高可用
    NTP时间服务
    ssl简介与openssl的使用
    一些高效学习方法-牛人是怎么来的
  • 原文地址:https://www.cnblogs.com/buakaw/p/8967907.html
Copyright © 2011-2022 走看看