Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

ontoone/SimpleViewPager

Repository files navigation

#ViewPager学习

ViewPager实现无限循环(伪无限循环)

在getCount()方法中返回无限大的整数

public int getCount() {
 //无线循环
 return Integer.MAX_VALUE;
}

在instantiateItem()对position进行处理

public Object instantiateItem() {
		 //使得position的取值在 [0, (data.size-1)]之间
 position = position % data.size(); //data为数据
}	 

最后设置viewpager的位置

//将viewpager的位置设置大概在中间的位置, 使得可以左右循环
ViewPager setCurrentItem(data.size() * 10000);

完成以上三步, viewpager便实现了无限循环的功能

ViewPager实现自动轮播

定义一个Task类实现Runnable接口

class Task implements Runnable {
 public void start() {
 //移除以前发送的所有消息, 以免影响现在的消息
 handler.removeCallbacksAndMessages(null); 
 
 handler.postDelayed(this, 3000);
 }
 @Override
 public void run() {
 int currentItem = mViewPager.getCurrentItem();
 currentItem++;
 mViewPager.setCurrentItem(currentItem);
 //继续发送延时3s消息, 实现内循环
 handler.postDelayed(this, 3000);
 }
}

在ViewPager设置adapter后开启任务

Task task = new Task();
task.start(); 

完成上述二步后, 自动轮播变完成

ViewPager切换动画

定义ViewPager

核心的2个地方

android:clipChildren="false"
viewPager.setPageTransformer

在定义xml定义ViewPager是添加属性

//该属性的意思就是在子View进行绘制时不要去裁切它们的显示范围
android:clipChildren="false"	

注意:要将在ViewPager中展示的图片设置属性

//设置Page间间距
mViewPager.setPageMargin(20);
//设置缓存的页面数量
mViewPager.setOffscreenPageLimit(3);

定义自己的PageTransformer实现PageTransformer (都是v4包下的)

自定义的PageTransformer只需实现一个方法即可

public void pageTransform(View view, float position){
 	//position区间 [-Infinity,-1) [-1,1] (1,+Infinity]
 if (position < -1) { //左边的page
 view.setScaleX(mMinScale);
 view.setScaleY(mMinScale);
 } else if (position <= 1) { // [-1,1] 滑动过程中position的变化
 if (position < 0) //[0,-1]
 {
 //scale值 1 -> mMinScale
 float factor = mMinScale + (1 - mMinScale) * (1 + position);
 view.setScaleX(factor);
 view.setScaleY(factor);
 } else//[1,0]
 {
 //scale值 mMinScale -> 1
 float factor = mMinScale + (1 - mMinScale) * (1 - position);
 view.setScaleX(factor);
 view.setScaleY(factor);
 }
 } else { // 右边的page
 view.setScaleX(mMinScale);
 view.setScaleY(mMinScale);
 }
}

来详细解释下上述代码

将position分成三个区间==[-Infinity,-1)== ==[-1,1]== ==(1,+Infinity]==

第一个和最后一个区间是当前显示page的左右2边, 设置默认的缩放即可

[-1, 1]为当前page左右切换的区间

第1页->第2页

  • 页1的postion变化为:从0到-1

  • 页2的postion变化为:从1到0

到这里就完成!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

AltStyle によって変換されたページ (->オリジナル) /