一、简介

ViewPager是Android扩展包v4包中直接继承于ViewGrounp的容器类(如果你现在使用Android Studio开发的话就不用导入v4b包了,因为v7中就已经包含了v4),可以通过创建PageAdapter添加其他的View; 其实它也是个视图翻页工具,可以实现多页面切换的效果;主要用于fragment切换(这一部分比较简单文章也比较多,这里就不多说了),酷炫图片展示,轮播图等等...

这篇文章主要给大家分享一下一个界面显示多个item的两种实现方法以及无限轮播图。

二、效果图

二、1 首先介绍一下ViewGrounp中的一个属性 clipChildren

clipChildren是ViewGroup中的一个很好的属性,用于定义子元素超出父元素的部分是否进行绘制.通常用于动画效果中需要绘制超出原有尺寸的元素时使用。clipChildren的值是哥boolean型,false表示可以超出父元素,true表示不可超出父元素。而且它的使用需要用在父元素上。并且自身也要使用layout_gravity="bottom"属性,代码如下:

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

    <TextView
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:layout_above="@+id/footer" />

    <LinearLayout
        android:id="@+id/footer"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="@android:color/white"
        android:layout_alignParentBottom="true"
        android:gravity="center"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/ic_receive"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:layout_weight="1"
            android:drawableTop="@drawable/receive_select"
            android:text="首页"
            android:textColor="@drawable/index_select_color" />

        <TextView
            android:id="@+id/ic_order"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="嘿嘿"
            android:gravity="center"
            android:layout_weight="1"
            android:drawableTop="@drawable/order_select"
            android:textColor="@drawable/index_select_color" />

        <LinearLayout
            android:id="@+id/centerFl"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:layout_marginBottom="10dp"
            android:gravity="center"
            android:layout_gravity="bottom"
            android:background="@drawable/middle_circle">

            <ImageView
                android:id="@+id/middleRotate"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:src="@drawable/ic_and" />
        </LinearLayout>

        <TextView
            android:id="@+id/ic_subscribe"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="哈哈"
            android:layout_weight="1"
            android:gravity="center"
            android:drawableTop="@drawable/subscribe_select"
            android:textColor="@drawable/index_select_color" />

        <TextView
            android:id="@+id/ic_mine"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="呵呵"
            android:layout_weight="1"
            android:gravity="center"
            android:drawableTop="@drawable/mine_select"
            android:textColor="@drawable/index_select_color" />

    </LinearLayout>
</RelativeLayout>

其实就注意两点(1)clipChildren 属性用在父元素上;(2)自身元素要使用layout_gravity="bottom"属性,使用其他属性或者不使用此属性可自行验证效果。

二、2 下面看一下ViewPager酷炫图片显示以及透明度和缩放设计

ViewPager实现一个界面显示多个item有两中方法:

1、clipChildren + pageTransformer; clipChildern上面已经说过了这里就不多介绍了;PageTransformer是ViewPager内部定义的接口,实现该接口并应用于ViewPager可以控制ViewPager中item view的滑动效果。废话不多说,上代码:

Activity代码:setOffscreenPageLimit(3)是预加载个数,设置3其实是预加载4张图片;OutPageTransformerClipPd()是自定义的pageTransformer,透明度和缩放效果就是在这里实现的(具体使用下面会有介绍)

ClipPaddingAdp viewPagerAdp = new ClipPaddingAdp(this, listClipPadding);
/*
 * ========== clipToPadding+pageTransformer ============*/
//缓存个数
clipPaddingVpg.setOffscreenPageLimit(3);
//设置显示效果 缩放 透明度
clipPaddingVpg.setPageTransformer(false, new OutPageTransformerClipPd());
clipPaddingVpg.setAdapter(viewPagerAdp);

layout 布局代码:这里还是和前面底部导航栏中间按钮差不多,父元素使用clipChildren属性,子元素使用marginStart和marginEnd属性否则图片就会满屏显示不会出现3个item的效果这一点要注意

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipChildren="false"
    tools:context=".ViewPagerImg">
    
        <TextView
        android:id="@+id/titleTwo"
        android:padding="5dp"
        android:layout_below="@+id/clipPaddingVpg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="clipChildren+PageTransformer 注意:viewPager要使用marginStart和        
        marginEnd属性这样一个界面才会出现多个图片"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/clipChildrenVpg"
        android:layout_below="@+id/titleTwo"
        android:layout_width="match_parent"
        android:layout_marginStart="30dp"
        android:layout_marginEnd="30dp"
        android:layout_height="100dp"/>

</RelativeLayout>

Adapter 适配器代码:中间一些方法的使用以及注意事项已在代码中标出,希望对你有所帮助

public class ClipPaddingAdp extends PagerAdapter {

    private List<String> mList;
    private Context context;

    public ClipPaddingAdp(Context context, List<String> list) {
        this.context = context;
        mList = list;
    }

    /**
     * 该方法是判断当前object对应的View是否需要更新,在调用notifyDataSetChanged时会间接触发该方法,
     * 如果返回POSITION_UNCHANGED表示该页面不需要更新,如果返回POSITION_NONE则表示该页面无效了,
     * 需要销毁并触发destroyItem方法(并且有可能调用instantiateItem重新初始化这个页面)
     * 所以说在使用PagerAdapter的时候会出现数据更新了显示界面中的数据没有改变,那就是因为这个方法的问题了。
     */
    @Override
    public int getItemPosition(@NonNull Object object) {
        return POSITION_NONE;
    }

    @Override
    public int getCount() {
        return mList.size();
    }

    /**
     * isViewFromObject()此方法方法用于判断是否由对象生成界面,官方建议直接返回 return view == object;。
     * 从名称理解起来像是判断view是否来自object,跟进一步解释应该instantiateItem方法中
     * 向container中添加的view和方法返回的对象两者之间一对一的关系;因为在ViewPager内部有个方法叫infoForChild,
     * 这个方法是通过view去找到对应页面信息缓存类ItemInfo(内部调用了isViewFromObject),
     * 如果找不到,说明这个view是个野孩子,ViewPager会认为不是Adapter提供的View,所以这个View不会显示出来;
     * 也就是说:isViewFromObject 方法是让view和object(内部为ItemInfo)一一对应起来
     */
    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
        return view == o;
    }

    /**
     * instantiateItem(ViewGroup container, int position)方法是初始化要显示的页面或需要缓存的页面。
     * 当ViewPager需要加载某个页面时调用,container就是ViewPager自己,position页面索引;
     * 我们需要实现的是添加一个view到container中,然后返回一个跟这个view能够关联起来的对象,这个对象可以是view自身,
     * 也可以是其他对象(比如FragmentPagerAdapter返回的就是一个Fragment),关键是在isViewFromObject能够将view和这个object关联起来
     */
    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        View view = LayoutInflater.from(context).inflate(R.layout.layout_img, container, false);
        ImageView imageView = view.findViewById(R.id.img);
        Glide.with(context).load(mList.get(position)).into(imageView);
        (container).addView(view, 0);
        return view;
    }

    /**
     * destroyItem顾名思义就是当ViewPager需要销毁一个页面时调用,我们需要将position对应的view从container中移除。
     * 这时参数除了position就只有object,其实就是上面instantiateItem方法返回的对象,这时要通过object找到对应的View,然后将其移除掉,
     * 如果你的instantiateItem方法返回的就是View,这里就直接强转成View移除即可:container.removeView((View) object);
     * 如果不是,一般会自己创建一个List缓存view列表,然后根据position从List中找到对应的view移除;(当然你也可以不移除,内存泄漏)。
     * 在FragmentPagerAdapter中是:mCurTransaction.detach((Fragment)object)这样的,其实也就是将fragemnt的view从container中移除
     */
    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView((View) object);
    }

}

pageTransformer  接口自定义代码:这个方法算是核心部分了,这里我们就实现透明度和缩放效果,当然也可以加入其他的一些效果,只要你想得到没有代码做不到...言归正传实现PagerTransformer只需要继承transformPage()这一个方法即可,其中要注意position这个参数,它不是item的索引而是item的位置。简单的描述一下三张图片的位置变化:

                                                        

中间图片的position = 0;先做滑动的时候:中间图片的位置从0->1;左边图片的位置从-1->0;知道了每个图片的位置信息再去设计效果就比较容易了。关于图片的缩放比例各位可以按照自己的尺寸自己设计这个很简单。这里要说一下透明度的计算,这个部分网上也有很多,但是大部分都是和缩放比例在一起计算,结果也是没有问题的,方法如下:
        float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
        page.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA));
 可能是我有什么没有考虑进去,实在想不到是怎么算出来的,如有大神了解还请指教,感激不尽。我这里计算的就比较简单了,就是带绝对值的一元一次方程,很简单,暂时也没发现问题。

public class OutPageTransformerClipCd implements ViewPager.PageTransformer {
    private static final float MIN_SCALE = 0.9f;
    private static final float MIN_ALPHA = 0.5f;

    @Override
    public void transformPage(View page, float position) {
        if (position < -1 || position > 1) {
            page.setAlpha(MIN_ALPHA);
            page.setScaleX(MIN_SCALE);
            page.setScaleY(MIN_SCALE);
        } else {
            if (position < 0) {
                float scaleX = 1 + 0.1f * position;
                page.setScaleX(scaleX);
                page.setScaleY(scaleX);
            } else {
                float scaleX = 1 - 0.1f * position;
                page.setScaleX(scaleX);
                page.setScaleY(scaleX);
            }
            page.setAlpha((MIN_ALPHA-1)*Math.abs(position)+1);
        }
    }
}

以上就是clipChildren + pageTransformer实现同一界面多个item以及透明度和缩放的效果了。

2、接下来简单的介绍一下实现同一个界面多个item的另一种方法:clipToPadding + pageTransformer; clipToPadding顾名思义就是控制padding部分是否绘制的属性,它和clipChildren效果差不多;需要注意的是clipToPadding属性用在自身上,true:不绘制;false:绘制;而且还要与paddingStart和paddingEnd一起食用,上代码:(Adapter和之前一样,这里就不再介绍)

layout 布局代码:自身使用clipToPadding=false属性,而且使用paddingStart和paddingEnd属性否则图片就会满屏显示不会出现3个item的效果这一点要注意

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ViewPagerImg">
    
        <TextView
        android:id="@+id/titleTwo"
        android:padding="5dp"
        android:layout_below="@+id/clipPaddingVpg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="clipToPadding+PageTransformer 注意:viewPager要使用paddingStart和paddingEnd属性这样一个界面才会出现多个图片"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/clipPaddingVpg"
        android:layout_below="@+id/titleOne"
        android:layout_width="match_parent"
        android:paddingStart="30dp"
        android:paddingEnd="30dp"
        android:clipToPadding="false"
        android:layout_height="100dp"/>

</RelativeLayout>

pageTransformer 对应clipToPadding属性的代码:当使用clipToPadding属性时, item的位置参数position和使用clipChildren时position的值是不一样的,这里当item位于中间时position != 0,而是等于0.1,当然左边也不等于-1,而是等于-0.9;右边也不等于1,而是等于1.1;知道position值的变化区间后,透明度就好算了,这里就不再多说了也是两个一元一次方程,缩放的话和之前是一样的。

public class OutPageTransformerClipPd implements ViewPager.PageTransformer {
    private static final float MIN_SCALE = 0.9f;
    private static final float MIN_ALPHA = 0.5f;

    @Override
    public void transformPage(View page, float position) {

        if (position < -1 || position > 1) {
            page.setAlpha(MIN_ALPHA);
            page.setScaleX(MIN_SCALE);
            page.setScaleY(MIN_SCALE);
        } else {
            if (position < 0) {
                float scaleX = 1 + 0.1f * position;
                page.setAlpha(MIN_ALPHA + (1 + position-0.1f) * (1 - MIN_ALPHA));
                page.setScaleX(scaleX);
                page.setScaleY(scaleX);
            } else {
                //这里减0.1f的原因是因为当图片滑动的时候最右侧图片的位置即position从1->0;中间图片的position 0->-1;所以在使用clipChildren的时候,显示在中间位置图片的position并等于0;
                // 但是现在咱们使用的是clipToPadding属性,这时候在中间位置图片的position并不等于0而是等于0.1
                //所以为了实现图片在中间位置时透明度为1必须要在方程中加上或减去0.1 关于方程的算法很简单一元一次方程这里就不说了。
                float scaleX = 1 - 0.1f * position;
                page.setAlpha(MIN_ALPHA + (1 - position + 0.1f) * (1 - MIN_ALPHA));
                page.setScaleX(scaleX);
                page.setScaleY(scaleX);
            }
        }
    }
}

到这里一个界面显示多个item效果的两种方法已经都实现了,是不是很简单呢!

有人会说两种方法到底哪一种会好一点呢,着就要更具你的需求来了,其实clipChildren 和 clipToPadding效果上是没什么区别的,个人感觉最大的区别就是clipToPadding属性左右两边的padding部分是可以触发滑动事件的,而clipChildren属性左右两边的margin部分时无法触发滑动事件的,这也很好理解,一个时padding,一个是margin,字面意思就可理解了。

三、接下来咱们来看看无限轮播图的实现

先介绍一下实现的思路,首先是要实现viewpager左右滑动效果,这个就是配置一个适配器就ok了,Adapter部分还是使用之前的,这里不做介绍。图片显示了那就是要开个线程每隔一段时间就执行一次ViewPager的setCurrentItem(int position)方法,就可以实现轮播图;那怎么实现无限轮播呢,可以这样来实现,在你的图片数组中的起始位置添加最后一张图片,在最后位置添加原数据的第一张图片,这里我们模拟以下数据:

private void getData() {
        /*
         * 无限轮播效果实现:列如有四张图片需要轮播,那么为了实现无限轮播效果我们在第一张图前面添加第四张图;在最后一张后面添加原来的第一张图
         * */
        listPlayer = new ArrayList<>();
        //新添加的第四张图
        listPlayer.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955484412&di=4015797ae24b365fb68f778a82b3ac15&imgtype=0&src=http%3A%2F%2Fpic22.nipic.com%2F20120725%2F9676681_001949824394_2.jpg");
        //正常得四张图片
        listPlayer.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955335245&di=e9661fe30faf0e5b6ee0827df2dd73c9&imgtype=0&src=http%3A%2F%2Fpic25.nipic.com%2F20121112%2F9252150_150552938000_2.jpg");
        listPlayer.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955390188&di=033a30aa04278adc5208fe2d7c21ae6a&imgtype=0&src=http%3A%2F%2Fpic16.nipic.com%2F20111006%2F6239936_092702973000_2.jpg");
        listPlayer.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955417834&di=720f6e63144231ff1a80bc6f85e25987&imgtype=0&src=http%3A%2F%2Fpic51.nipic.com%2Ffile%2F20141025%2F8649940_220505558734_2.jpg");
        listPlayer.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955484412&di=4015797ae24b365fb68f778a82b3ac15&imgtype=0&src=http%3A%2F%2Fpic22.nipic.com%2F20120725%2F9676681_001949824394_2.jpg");
        //新添加得第一张图
        listPlayer.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955335245&di=e9661fe30faf0e5b6ee0827df2dd73c9&imgtype=0&src=http%3A%2F%2Fpic25.nipic.com%2F20121112%2F9252150_150552938000_2.jpg");
    }

当滑动的时候我们监听一下ViewPager的addOnPageChangeListener()方法,在onPageScrollStateChanged(int state) 方法中执行代码,当滑动结束的时候判断position,当position == 0的时候将position切换到第四张图片的位置且不带动画;当position == listPlayer.size()-1时将position切换到第一张图片的位置这样就实现了无限轮播,下面看一下代码:

playerVpg.setAdapter(viewPagerAdpTwo);
        playerVpg.setCurrentItem(position);
        playerVpg.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {

            }

            @Override
            public void onPageSelected(int i) {
                position = i;
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                //验证当前的滑动是否结束
                if (state == ViewPager.SCROLL_STATE_IDLE) {
                    if (position == 0) {
                        //切换,不要动画效果
                        playerVpg.setCurrentItem(listPlayer.size() - 2, false);
                    } else if (position == listPlayer.size() - 1) {
                        //切换,不要动画效果
                        playerVpg.setCurrentItem(1, false);
                    }
                }
            }
        });

这里的position要自己维护,默认值=1。关于线程的实现我这里使用的是Handler+Runnable实现主线程与子线程之间的切换,当然也有很多其他的方法,这里就不一一介绍。到这里基本已经完成了,但是还不完美, 当轮播开始以后,用手去手动的滑动图片,就会出现问题,图片轮播就会混乱或者卡死,要解决这个问题我们就要监听ViewPager的setOnTouchListener()方法,当收触摸时,关闭自动轮播;当手离开时开启自动轮播,完整代码如下:

public class ViewPagerImg extends DefaultBaseActivity {

    @BindView(R.id.clipPaddingVpg)
    ViewPager clipPaddingVpg;
    @BindView(R.id.clipChildrenVpg)
    ViewPager clipChildrenVpg;
    @BindView(R.id.playerVpg)
    ViewPager playerVpg;
    private List<String> listClipPadding;
    private List<String> listPlayer;
    private int position = 1;
    private boolean isAutoPlay = true;

    private Handler handler = new Handler();

    @SuppressLint("ClickableViewAccessibility")
    @Override
    protected void init(Bundle savedInstanceState) {
        getClipPaddingData();
        ClipPaddingAdp viewPagerAdp = new ClipPaddingAdp(this, listClipPadding);
        /*
         * ========== clipToPadding+pageTransformer ============*/
        //缓存个数
        clipPaddingVpg.setOffscreenPageLimit(3);
        //设置显示效果 缩放 透明度
        clipPaddingVpg.setPageTransformer(false, new OutPageTransformerClipPd());
        clipPaddingVpg.setAdapter(viewPagerAdp);

        /*
         * ========== clipChildren+pageTransformer ============*/
        //缓存个数
        clipChildrenVpg.setOffscreenPageLimit(3);
        //设置显示效果 缩放 透明度
        clipChildrenVpg.setPageTransformer(false, new OutPageTransformerClipCd());
        clipChildrenVpg.setAdapter(viewPagerAdp);

        /*
         * ========== 无限轮播 ============*/
        getData();
        ClipPaddingAdp viewPagerAdpTwo = new ClipPaddingAdp(this, listPlayer);
        playerVpg.setAdapter(viewPagerAdpTwo);
        playerVpg.setCurrentItem(position);
        playerVpg.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {

            }

            @Override
            public void onPageSelected(int i) {
                position = i;
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                //验证当前的滑动是否结束
                if (state == ViewPager.SCROLL_STATE_IDLE) {
                    if (position == 0) {
                        //切换,不要动画效果
                        playerVpg.setCurrentItem(listPlayer.size() - 2, false);
                    } else if (position == listPlayer.size() - 1) {
                        //切换,不要动画效果
                        playerVpg.setCurrentItem(1, false);
                    }
                }
            }
        });

        playerVpg.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_MOVE:
                        break;
                    case MotionEvent.ACTION_DOWN:
                        handler.removeCallbacks(runnable);
                        break;
                    //当你触摸时停止自动滑动
                    case MotionEvent.ACTION_UP:
                        handler.postDelayed(runnable,2000);
                        break;
                    default:
                        break;
                }
                return false;
            }
        });
    }

    //轮播线程
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            if (isAutoPlay) {
                position = playerVpg.getCurrentItem();
                position++;
                playerVpg.setCurrentItem(position);
                handler.postDelayed(this, 2000);
            } else {
                handler.postDelayed(this, 2000);
            }

        }
    };

    private void getData() {
        /*
         * 无限轮播效果实现:列如有四张图片需要轮播,那么为了实现无限轮播效果我们在第一张图前面添加第四张图;在最后一张后面添加原来的第一张图
         * */
        listPlayer = new ArrayList<>();
        //新添加的第四张图
        listPlayer.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955484412&di=4015797ae24b365fb68f778a82b3ac15&imgtype=0&src=http%3A%2F%2Fpic22.nipic.com%2F20120725%2F9676681_001949824394_2.jpg");
        //正常得四张图片
        listPlayer.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955335245&di=e9661fe30faf0e5b6ee0827df2dd73c9&imgtype=0&src=http%3A%2F%2Fpic25.nipic.com%2F20121112%2F9252150_150552938000_2.jpg");
        listPlayer.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955390188&di=033a30aa04278adc5208fe2d7c21ae6a&imgtype=0&src=http%3A%2F%2Fpic16.nipic.com%2F20111006%2F6239936_092702973000_2.jpg");
        listPlayer.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955417834&di=720f6e63144231ff1a80bc6f85e25987&imgtype=0&src=http%3A%2F%2Fpic51.nipic.com%2Ffile%2F20141025%2F8649940_220505558734_2.jpg");
        listPlayer.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955484412&di=4015797ae24b365fb68f778a82b3ac15&imgtype=0&src=http%3A%2F%2Fpic22.nipic.com%2F20120725%2F9676681_001949824394_2.jpg");
        //新添加得第一张图
        listPlayer.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955335245&di=e9661fe30faf0e5b6ee0827df2dd73c9&imgtype=0&src=http%3A%2F%2Fpic25.nipic.com%2F20121112%2F9252150_150552938000_2.jpg");
    }

    private void getClipPaddingData() {
        listClipPadding = new ArrayList<>();
        listClipPadding.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955335245&di=e9661fe30faf0e5b6ee0827df2dd73c9&imgtype=0&src=http%3A%2F%2Fpic25.nipic.com%2F20121112%2F9252150_150552938000_2.jpg");
        listClipPadding.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955390188&di=033a30aa04278adc5208fe2d7c21ae6a&imgtype=0&src=http%3A%2F%2Fpic16.nipic.com%2F20111006%2F6239936_092702973000_2.jpg");
        listClipPadding.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955417834&di=720f6e63144231ff1a80bc6f85e25987&imgtype=0&src=http%3A%2F%2Fpic51.nipic.com%2Ffile%2F20141025%2F8649940_220505558734_2.jpg");
        listClipPadding.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955484412&di=4015797ae24b365fb68f778a82b3ac15&imgtype=0&src=http%3A%2F%2Fpic22.nipic.com%2F20120725%2F9676681_001949824394_2.jpg");
        listClipPadding.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955335245&di=e9661fe30faf0e5b6ee0827df2dd73c9&imgtype=0&src=http%3A%2F%2Fpic25.nipic.com%2F20121112%2F9252150_150552938000_2.jpg");
        listClipPadding.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955390188&di=033a30aa04278adc5208fe2d7c21ae6a&imgtype=0&src=http%3A%2F%2Fpic16.nipic.com%2F20111006%2F6239936_092702973000_2.jpg");
        listClipPadding.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955417834&di=720f6e63144231ff1a80bc6f85e25987&imgtype=0&src=http%3A%2F%2Fpic51.nipic.com%2Ffile%2F20141025%2F8649940_220505558734_2.jpg");
        listClipPadding.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1570955484412&di=4015797ae24b365fb68f778a82b3ac15&imgtype=0&src=http%3A%2F%2Fpic22.nipic.com%2F20120725%2F9676681_001949824394_2.jpg");
    }

    @Override
    protected int getLayoutId() {
        return R.layout.activity_pager_adp;
    }

    @Override
    protected void onResume() {
        super.onResume();
        //每次重新进入时开始轮播
        handler.postDelayed(runnable, 2000);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacks(runnable);
    }

    @Override
    public void onClick(View view) {

    }
}

关闭Activity时不要忘记将轮播关闭奥...

四、源码下载

https://github.com/JR-Stone/ViewPager

五、文章推荐

1、CoordinatorLayout + AppBarLayout + NestedScrollView 组合使用实现地图背景,滑动悬停华丽效果。仿饿了么地图界面 

     https://blog.csdn.net/jason_rui/article/details/100222797

2、EditText限制小数点后输入的个数   https://blog.csdn.net/jason_rui/article/details/100538747

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐