ViewPager 实现图片自动无限轮播、酷炫效果的实现(同时显示出多个item)、底部导航栏实现中间
一、简介ViewPager是Android扩展包v4包中直接继承于ViewGrounp的容器类(如果你现在使用Android Studio开发的话就不用导入v4b包了,因为v7中就已经包含了v4),可以通过创建PageAdapter添加其他的View;其实它也是个视图翻页工具,可以实现多页面切换的效果;主要用于fragment切换(这一部分比较简单文章也比较多,这里就不多说了),酷炫图...
一、简介
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
更多推荐
所有评论(0)