无限轮播的ViewPager+导航小圆点()

  1. 要实现自动轮播的ViewPager  要先写一个类 来继承ViewPager
  2. package com.testcyclepager;
    
    import android.content.Context;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v4.view.PagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import com.nineoldandroids.view.ViewHelper;
    
    import java.util.HashMap;
    import java.util.LinkedHashMap;
    
    /**
     * Created by SFS on 2017/2/26.
     */
    public class CycleViewPager extends ViewPager {
    
        private float mTrans;
        private float mScale;
        /**
         * 最大的缩小比例
         */
        private static final float SCALE_MAX = 0.5f;
    
        /**
         * 保存position与对于的View
         */
        private HashMap<Integer, View> mChildrenViews = new LinkedHashMap<Integer, View>();
        /**
         * 滑动时左边的元素
         */
        private View mLeft;
        /**
         * 滑动时右边的元素
         */
        private View mRight;
    
        public CycleViewPager(Context context) {
            super(context);
        }
    
        public CycleViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
    
        @Override
        public void addOnPageChangeListener(OnPageChangeListener listener) {
           innerOnPageChangeListener onPageChangeListener=new innerOnPageChangeListener(listener);
            super.addOnPageChangeListener(onPageChangeListener);
        }
    
    
        @Override
        public void setAdapter(PagerAdapter adapter) {
            innerPagerAdapter innerPagerAdapter = new innerPagerAdapter(adapter);
            super.setAdapter(innerPagerAdapter);
             addOnPageChangeListener(null);
            //设置默认显示页面
            setCurrentItem(1);
            //开始轮播
            startScroll();
    
        }
        /**
         * 内部监听
         */
         class innerOnPageChangeListener implements  OnPageChangeListener{
    
            private int position;
            private OnPageChangeListener listener;
    
            public innerOnPageChangeListener(OnPageChangeListener listener) {
    
                this.listener = listener;
            }
    
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                if (listener != null) {
                    listener.onPageScrolled(position,positionOffset,positionOffsetPixels);
                }
    //            //滑动特别小的距离时,我们认为没有动,可有可无的判断
    //            float effectOffset = isSmall(positionOffset) ? 0 : positionOffset;
    //
    //            //获取左边的View
    //            mLeft = findViewFromObject(position);
    //            //获取右边的View
    //            mRight = findViewFromObject(position + 1);
    //
    //            // 添加切换动画效果
    //            animateStack(mLeft, mRight, effectOffset, positionOffsetPixels);
    
            }
    
            @Override
            public void onPageSelected(int position) {
    
                this.position = position;
                if (listener != null) {
                    listener.onPageSelected(position);
                }
            }
    
            @Override
            public void onPageScrollStateChanged(int state) {
    
                //当前页面状态为空闲
                if (state==ViewPager.SCROLL_STATE_IDLE) {
                    if (position == 0) {
                        setCurrentItem(getAdapter().getCount() - 2, false);
                    } else if (position == getAdapter().getCount() - 1) {
                        setCurrentItem(1, false);
                    }
                }
    
                if (listener != null) {
                    listener.onPageScrollStateChanged(state);
                }
    
            }
    
    
            public void setObjectForPosition(View view, int position)
            {
                mChildrenViews.put(position, view);
            }
    
            public View findViewFromObject(int position)
            {
                return mChildrenViews.get(position);
            }
            private boolean isSmall(float positionOffset)
            {
                return Math.abs(positionOffset) < 0.0001;
            }
            protected void animateStack(View left, View right, float effectOffset,
                                        int positionOffsetPixels)
            {
                if (right != null)
                {
                    /**
                     * 缩小比例 如果手指从右到左的滑动(切换到后一个):0.0~1.0,即从一半到最大
                     * 如果手指从左到右的滑动(切换到前一个):1.0~0,即从最大到一半
                     */
                    mScale = (1 - SCALE_MAX) * effectOffset + SCALE_MAX;
                    /**
                     * x偏移量: 如果手指从右到左的滑动(切换到后一个):0-720 如果手指从左到右的滑动(切换到前一个):720-0
                     */
                    mTrans = -getWidth() - getPageMargin() + positionOffsetPixels;
                    ViewHelper.setScaleX(right, mScale);
                    ViewHelper.setScaleY(right, mScale);
                    ViewHelper.setTranslationX(right, mTrans);
                }
                if (left != null)
                {
                    left.bringToFront();
                }
            }
    
    
        }
    
        /**
         * 设置触摸滑动的监听
         * @param ev
         * @return
         */
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            switch (ev.getAction()){
                case MotionEvent.ACTION_DOWN:
                    stopScroll();
                    Toast.makeText(getContext(), "点击了屏幕", Toast.LENGTH_SHORT).show();
                break;
                case MotionEvent.ACTION_MOVE:
                break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                    startScroll();
                    Toast.makeText(getContext(), "松开了屏幕", Toast.LENGTH_SHORT).show();
                break;
    
    
            }
            return super.onTouchEvent(ev);
        }
    
        private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                int currentItem = getCurrentItem();
                currentItem++;
                setCurrentItem(currentItem);
                handler.sendEmptyMessageDelayed(1, 3000);
            }
        };
    
        /**
         * 开始无限轮播
         */
        private void startScroll() {
            handler.sendEmptyMessageDelayed(1, 3000);
        }
    
        /**
         * 停止无限轮播
         */
        private void stopScroll() {
            handler.removeMessages(1);
        }
    
    
        /**
         * 修正PagerAdapter 适配器
         */
        class innerPagerAdapter extends PagerAdapter {
    
            private PagerAdapter adapter;
    
            public innerPagerAdapter(PagerAdapter adapter) {
    
                this.adapter = adapter;
            }
    
            /**
             * Return the number of views available.
             */
            @Override
            public int getCount() {
                return adapter.getCount() + 2;
            }
    
    
            @Override
            public boolean isViewFromObject(View view, Object object) {
                return adapter.isViewFromObject(view, object);
            }
    
    
            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                if (position == 0) {
                    position = adapter.getCount() - 1;
                } else if (position == getCount() - 1) {
                    position = 0;
                } else {
                    position -= 1;
                }
                return adapter.instantiateItem(container, position);
            }
    
            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                adapter.destroyItem(container, position, object);
            }
        }
    
    }
    

  3. 在 MainActivity 中 进行ViewPager 的 初始化操作   main.xml 如下
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.testcyclepager.MainActivity">
    
     <com.testcyclepager.CycleViewPager
         android:id="@+id/CycleViewPager"
         android:layout_width="match_parent"
         android:layout_height="match_parent"/>
     <LinearLayout
         android:gravity="center"
         android:layout_alignParentBottom="true"
         android:layout_marginBottom="50dp"
         android:id="@+id/LinearLayout"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal">
     </LinearLayout>
    </RelativeLayout>
  4. 在  MainActivity 中 进行初始化操作以及 监听
    package com.testcyclepager;
    
    import android.os.Build;
    import android.support.v4.view.PagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    
    public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener {
    
        private CycleViewPager mViewPager;
        private CyclePagerAdapter adapter;
    
        private ImageView[] mPoints;
    
        private int[] Imgs = {R.drawable.one, R.drawable.two, R.drawable.three, R.drawable.four, R.drawable.five, R.drawable.six,R.mipmap.ic_launcher};
        private LinearLayout mLayout;
        private ImageView mPoint;
        private LinearLayout.LayoutParams params;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mViewPager = (CycleViewPager) findViewById(R.id.CycleViewPager);
            mLayout = (LinearLayout) findViewById(R.id.LinearLayout);
    
    
            mPoints = new ImageView[Imgs.length];
    
                //  添加 底部导航点
            for (int i = 0; i < Imgs.length; i++) {
                mPoint = new ImageView(this);
                params = new LinearLayout.LayoutParams(20, 20);
                params.setMargins(10,0,15,0);
                mPoint.setLayoutParams(params);
                mPoints[i] = mPoint;
                if (i == 0) {
                    // 默认选中第一张图片
                    mPoints[i].setBackgroundResource(R.drawable.shape_point_select);
                } else {
                    mPoints[i].setBackgroundResource(R.drawable.shape_point_normal);
                }
                mLayout.addView(mPoint);
            }
    
            adapter = new CyclePagerAdapter();
            mViewPager.setAdapter(adapter);
    
    
            mViewPager.addOnPageChangeListener(this);
        }
    
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
        }
    
        @Override
        public void onPageSelected(int position) {
            int item;
            if (position == 0) {
                position = adapter.getCount() - 1;
            } else if (position == adapter.getCount()+1) {
                position = 0;
            } else {
                position -= 1;
            }
            item=position;
            for (int i = 0; i < Imgs.length; i++) {
                mPoints[item].setBackgroundResource(R.drawable.shape_point_select);
                if (item != i) {
                    mPoints[i].setBackgroundResource(R.drawable.shape_point_normal);
                }
            }
        }
    
        @Override
        public void onPageScrollStateChanged(int state) {
    
        }
    
        class CyclePagerAdapter extends PagerAdapter {
    
            @Override
            public int getCount() {
                return Imgs.length;
            }
    
            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }
    
            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                container.removeView((View) object);
            }
    
            @Override
            public Object instantiateItem(ViewGroup container, int position) {
    
                ImageView imageView = new ImageView(MainActivity.this);
                imageView.setImageResource(Imgs[position]);
                container.addView(imageView);
    
                return imageView;
            }
        }
    
        /**
         * 用来进行沉浸式状态栏的设置
         *
         * @param hasFocus
         */
        @Override
        public void onWindowFocusChanged(boolean hasFocus) {
            super.onWindowFocusChanged(hasFocus);
            if (hasFocus && Build.VERSION.SDK_INT >= 19) {
                View decorView = getWindow().getDecorView();
                decorView.setSystemUiVisibility(
                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                                | View.SYSTEM_UI_FLAG_FULLSCREEN
                                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
            }
        }
        
    }
    
  5. 最后再 画一个Shape来进行导航样式        

  6. Shape_point_select.xml
         <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="oval">
        <stroke
            android:width="1dip"
            android:color="#f00"/>
        <solid android:color="#f00" />
    
    </shape>
  7. Shape_point_normal.xml
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="oval">
        <stroke
            android:width="1dip"
            android:color="#0078DA"/>
    
        <solid android:color="#0078DA" />
    
    </shape>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值