android viewpager轮播图滑到最后一页向左滑动到第一页,第一页向右滑动到最后一页
时间: 2023-09-22 11:15:24 浏览: 125
实现这个功能可以通过自定义 `ViewPager` 来实现。在 `ViewPager` 的适配器中,我们需要重写 `getCount()` 方法,返回一个比原来多 2 的值,因为我们需要在第一页之前添加最后一页的副本,在最后一页之后添加第一页的副本。然后我们需要重写 `instantiateItem()` 方法,当需要显示第一页之前或最后一页之后的页面时,我们需要设置 `ViewPager` 当前的位置为对应的位置,这样就可以实现无限循环滑动的效果了。
下面是一个简单的示例代码:
```java
public class LoopViewPager extends ViewPager {
private static final int FIRST_PAGE_INDEX = 1;
private static final int LAST_PAGE_INDEX = 5;
public LoopViewPager(Context context) {
super(context);
}
public LoopViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setAdapter(PagerAdapter adapter) {
super.setAdapter(adapter);
setCurrentItem(FIRST_PAGE_INDEX);
}
@Override
public void setCurrentItem(int item) {
if (item == 0) {
super.setCurrentItem(getChildCount() - 2, false);
} else if (item == getChildCount() - 1) {
super.setCurrentItem(1, false);
} else {
super.setCurrentItem(item, false);
}
}
@Override
public int getCurrentItem() {
int position = super.getCurrentItem();
if (position == 0) {
return getChildCount() - 3;
} else if (position == getChildCount() - 1) {
return 0;
} else {
return position - 1;
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP) {
autoScroll();
}
return super.onTouchEvent(ev);
}
private void autoScroll() {
int position = getCurrentItem();
if (position == 0) {
setCurrentItem(getChildCount() - 2, true);
} else if (position == getChildCount() - 3) {
setCurrentItem(1, true);
}
}
}
```
在这个自定义 `ViewPager` 中,我们通过重写 `setCurrentItem()` 方法来实现循环滑动的效果,同时也重写了 `getCurrentItem()` 方法来获取当前真实的位置。在 `onTouchEvent()` 方法中,我们监听了手指抬起的事件,在手指抬起后自动滑动到对应的页面。具体实现可以参考上面的代码,里面有注释解释每个方法的作用。
阅读全文