ViewPager无限自动轮播+动画
2016-12-02 14:09
330 查看
ViewPager几乎在每一个app中都会有使用,可以做导航页,也可以做广告、图片的播放。最近在做的app也用到了ViewPager,具体要实现的功能是能够无限轮播,并且在自动轮播时,图片在切换时能够有动画效果,当手指触摸时停止自动轮播,手指抬起时继续自动轮播。
闲话不多说,直接上代码
自定义ViewPager:
[java]
view plain
copy
public class MyViewPager extends ViewPager {
// 当前页
private int currentItem;
// ViewPagerAdapter实例
private ViewPagerAdapter mAdapter;
public MyViewPager(Context context) {
super(context);
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setAdapter(PagerAdapter adapter) {
mAdapter = (ViewPagerAdapter) adapter;
super.setAdapter(mAdapter);
}
/**
* 获取当前页
*
* @return
*/
public int getCurrentItem() {
return mAdapter.getMyPosition();
}
/**
* 获取MyViewPager实例
*
* @return
*/
public MyViewPager getMyViewPager() {
return mAdapter.getMyViewPager();
}
/**
* 设置当前页
*
* @param item
* @param smoothScroll
*/
public void setCurrentItem(int item, boolean smoothScroll) {
super.setCurrentItem(item, smoothScroll);
}
// 是否自动轮播
private boolean isStart = true;
// Handler
private Handler mHandler = new Handler();
// 图片自动轮播Task
private Runnable mImageTimerTask = new Runnable() {
@Override
public void run() {
try {// 自定义图片切换速度
Field field = ViewPager.class.getDeclaredField("mScroller");
field.setAccessible(true);
FixedSpeedScroller scroller = new FixedSpeedScroller(
getContext(), new AccelerateInterpolator());
field.set(getMyViewPager(), scroller);
scroller.setmDuration(500);
} catch (Exception e) {
e.printStackTrace();
}
currentItem = getCurrentItem();
int amount = currentItem;
/**
* 解决往左滑动后变成向左自动轮播的bug
*/
if(oldCurrentItem < currentItem){
setCurrentItem(currentItem, true);
}else{
currentItem += 2;
setCurrentItem(currentItem, true);
}
oldCurrentItem = amount;
if (isStart)
mHandler.postDelayed(mImageTimerTask, 2000);
}
};
/**
* 触摸事件: ACTION_DOWN 停止自动轮播 ACTION_UP 开始自动轮播
*/
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
// 开始图片滚动
startImageTimerTask();
} else if (event.getAction() == MotionEvent.ACTION_DOWN) {
// 停止图片滚动
stopImageTimerTask();
}
return super.dispatchTouchEvent(event);
}
/**
* 停止自动轮播
*/
public void stopImageTimerTask() {
isStart = false;
mHandler.removeCallbacks(mImageTimerTask);
}
/**
* 开始自动轮播
*/
public void startImageTimerTask() {
isStart = true;
mHandler.postDelayed(mImageTimerTask, 2000);
}
自定义PagerAdapter:
[b][java]
view plain
copy[/b]
public class ViewPagerAdapter extends PagerAdapter {
private List<view> viewList;
private int mPosition;
private MyViewPager mViewPager;
public ViewPagerAdapter(List<view> viewList, MyViewPager viewPager) {
super();
this.viewList = viewList;
mViewPager = viewPager;
}
/**
* 将count设为最大的整数,以达到无限轮播的效果
*/
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public void destroyItem(ViewGroup <a href="http://lib.csdn.net/base/docker" class='replace_word' title="Docker知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Container</a>, int position, Object object) {
((ViewPager) container).removeView(viewList.get(position
% viewList.size()));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
mPosition = position;
((ViewPager) container)
.addView(viewList.get(position % viewList.size()));
return viewList.get(position % viewList.size());
}
/**
* 获取当前页
*
* @return
*/
public int getMyPosition() {
return mPosition;
}
/**
* 获取MyViewPager实例
*
* @return
*/
public MyViewPager getMyViewPager() {
return mViewPager;
}
}</view></view>
切换动画google给的DepthPageTransformer:
[b][java] view
plain copy[/b]
public class DepthPageTransformer implements PageTransformer {
private static final float MIN_SCALE = 0.75f;
@Override
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
if (position < -1) {
view.setAlpha(0);
} else if (position <= 0) {
view.setAlpha(1);
view.setTranslationX(0);
view.setScaleX(1);
view.setScaleY(1);
} else if (position <= 1) {
view.setAlpha(1 - position);
view.setTranslationX(pageWidth * -position);
float scaleFactor = MIN_SCALE + (1 - MIN_SCALE)
* (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
} else {
view.setAlpha(0);
}
}
}
切换速度自定义:
[b][java] view
plain copy[/b]
public class FixedSpeedScroller extends Scroller {
private int mDuration = 1500;
public FixedSpeedScroller(Context context) {
super(context);
}
public FixedSpeedScroller(Context context, Interpolator interpolator) {
super(context, interpolator);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, mDuration);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy) {
super.startScroll(startX, startY, dx, dy, mDuration);
}
public void setmDuration(int time) {
mDuration = time;
}
public int getmDuration() {
return mDuration;
}
}
小圆点的变换:
[b][java] view
plain copy[/b]
public void onPageSelected(int position) {
dots.get(oldPosition % viewList.size()).setBackgroundResource(
R.drawable.dot_normal);
dots.get(position % viewList.size()).setBackgroundResource(
R.drawable.dot_focused);
oldPosition = position;
}
最后:
[b][java] view
plain copy[/b]
mViewPager.setCurrentItem(500);
mViewPager.setPageTransformer(true, new DepthPageTransformer());
mViewPager.startImageTimerTask();
闲话不多说,直接上代码
自定义ViewPager:
[java]
view plain
copy
public class MyViewPager extends ViewPager {
// 当前页
private int currentItem;
// ViewPagerAdapter实例
private ViewPagerAdapter mAdapter;
public MyViewPager(Context context) {
super(context);
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setAdapter(PagerAdapter adapter) {
mAdapter = (ViewPagerAdapter) adapter;
super.setAdapter(mAdapter);
}
/**
* 获取当前页
*
* @return
*/
public int getCurrentItem() {
return mAdapter.getMyPosition();
}
/**
* 获取MyViewPager实例
*
* @return
*/
public MyViewPager getMyViewPager() {
return mAdapter.getMyViewPager();
}
/**
* 设置当前页
*
* @param item
* @param smoothScroll
*/
public void setCurrentItem(int item, boolean smoothScroll) {
super.setCurrentItem(item, smoothScroll);
}
// 是否自动轮播
private boolean isStart = true;
// Handler
private Handler mHandler = new Handler();
// 图片自动轮播Task
private Runnable mImageTimerTask = new Runnable() {
@Override
public void run() {
try {// 自定义图片切换速度
Field field = ViewPager.class.getDeclaredField("mScroller");
field.setAccessible(true);
FixedSpeedScroller scroller = new FixedSpeedScroller(
getContext(), new AccelerateInterpolator());
field.set(getMyViewPager(), scroller);
scroller.setmDuration(500);
} catch (Exception e) {
e.printStackTrace();
}
currentItem = getCurrentItem();
int amount = currentItem;
/**
* 解决往左滑动后变成向左自动轮播的bug
*/
if(oldCurrentItem < currentItem){
setCurrentItem(currentItem, true);
}else{
currentItem += 2;
setCurrentItem(currentItem, true);
}
oldCurrentItem = amount;
if (isStart)
mHandler.postDelayed(mImageTimerTask, 2000);
}
};
/**
* 触摸事件: ACTION_DOWN 停止自动轮播 ACTION_UP 开始自动轮播
*/
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
// 开始图片滚动
startImageTimerTask();
} else if (event.getAction() == MotionEvent.ACTION_DOWN) {
// 停止图片滚动
stopImageTimerTask();
}
return super.dispatchTouchEvent(event);
}
/**
* 停止自动轮播
*/
public void stopImageTimerTask() {
isStart = false;
mHandler.removeCallbacks(mImageTimerTask);
}
/**
* 开始自动轮播
*/
public void startImageTimerTask() {
isStart = true;
mHandler.postDelayed(mImageTimerTask, 2000);
}
自定义PagerAdapter:
[b][java]
view plain
copy[/b]
public class ViewPagerAdapter extends PagerAdapter {
private List<view> viewList;
private int mPosition;
private MyViewPager mViewPager;
public ViewPagerAdapter(List<view> viewList, MyViewPager viewPager) {
super();
this.viewList = viewList;
mViewPager = viewPager;
}
/**
* 将count设为最大的整数,以达到无限轮播的效果
*/
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public void destroyItem(ViewGroup <a href="http://lib.csdn.net/base/docker" class='replace_word' title="Docker知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Container</a>, int position, Object object) {
((ViewPager) container).removeView(viewList.get(position
% viewList.size()));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
mPosition = position;
((ViewPager) container)
.addView(viewList.get(position % viewList.size()));
return viewList.get(position % viewList.size());
}
/**
* 获取当前页
*
* @return
*/
public int getMyPosition() {
return mPosition;
}
/**
* 获取MyViewPager实例
*
* @return
*/
public MyViewPager getMyViewPager() {
return mViewPager;
}
}</view></view>
切换动画google给的DepthPageTransformer:
[b][java] view
plain copy[/b]
public class DepthPageTransformer implements PageTransformer {
private static final float MIN_SCALE = 0.75f;
@Override
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
if (position < -1) {
view.setAlpha(0);
} else if (position <= 0) {
view.setAlpha(1);
view.setTranslationX(0);
view.setScaleX(1);
view.setScaleY(1);
} else if (position <= 1) {
view.setAlpha(1 - position);
view.setTranslationX(pageWidth * -position);
float scaleFactor = MIN_SCALE + (1 - MIN_SCALE)
* (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
} else {
view.setAlpha(0);
}
}
}
切换速度自定义:
[b][java] view
plain copy[/b]
public class FixedSpeedScroller extends Scroller {
private int mDuration = 1500;
public FixedSpeedScroller(Context context) {
super(context);
}
public FixedSpeedScroller(Context context, Interpolator interpolator) {
super(context, interpolator);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, mDuration);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy) {
super.startScroll(startX, startY, dx, dy, mDuration);
}
public void setmDuration(int time) {
mDuration = time;
}
public int getmDuration() {
return mDuration;
}
}
小圆点的变换:
[b][java] view
plain copy[/b]
public void onPageSelected(int position) {
dots.get(oldPosition % viewList.size()).setBackgroundResource(
R.drawable.dot_normal);
dots.get(position % viewList.size()).setBackgroundResource(
R.drawable.dot_focused);
oldPosition = position;
}
最后:
[b][java] view
plain copy[/b]
mViewPager.setCurrentItem(500);
mViewPager.setPageTransformer(true, new DepthPageTransformer());
mViewPager.startImageTimerTask();
相关文章推荐
- ViewPager无限自动轮播+动画
- ViewPager图片自动+手动左右无限轮播
- ViewPager图片无限自动轮播
- viewpager自动无限轮播(网络请求的图片)
- ViewPager的自动轮播与无限录播
- ViewPager轮播图:自动无限轮播,手指长按停止,实现点击事件(实用版)
- viewpager+Handler自动无限轮播
- ViewPager无限轮播与自动轮播简单demo
- 自定义ViewPager 图片无限自动轮播
- ViewPager自动无限轮播加小圆点
- Android ViewPager无限自动轮播
- 使用ViewPager实现自动无限循环的轮播
- ViewPager无限自动轮播
- android ViewPager实现自动无限轮播和下方向导圆点
- 自定义通用viewpager(左右无限滑动,自动轮播)
- [置顶] 自动轮播并且能够无限轮播的ViewPager,可纵向滑动、可修改滑动速度
- Android使用viewpager实现自动无限轮播图
- ViewPager轮播图自动无限循环滑动,手指按住停止滑动
- RecyclerView的上拉加载下拉刷新和viewpager自动有点无限轮播
- ViewPager 无限轮播 自动轮播