在一般商城类app的主界面 顶部 都有一个 不停滚动的 广告栏,如图:
此 效果主要有 viewPager无限循环的 滚动,以及viewPager下标的改变
ViewPager下标可以看我另外一篇博客
ViewPager循环 滚动思路主要如下:
在ViewPager的数据源中 将首尾各自 添加尾首的数据 重新包裹旧数据
当右滚动到 最后标号 1 条目时,马上跳转到数据源 第二个
当左滚动到标号 3 条目时,马上跳转 数据源 第 4个
此方法 实现 要注意 几个地方:
1,ViewPager滚动 是有 动画效果的 ,当首尾跳转时,需调用
setCurrentItem(int item, boolean smoothScroll)
第一个为 跳转下标,第二个为 是否显示跳转动画
2,ViewPager 首尾跳转 最好等 页面完成 加载后再 跳转,不然会有点视觉上的 卡顿
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (position == 0) {
borderTag = true;
borderJumpIndex = viewPager.getAdapter().getCount() - 2;
viewPagerIndex.setCheckIndex(borderJumpIndex - 1);
} else if (position == viewPager.getAdapter().getCount() - 1) {
borderTag = true;
borderJumpIndex = 1;
viewPagerIndex.setCheckIndex(borderJumpIndex - 1);
} else if (position < viewPager.getAdapter().getCount() - 1 && position > 0) {
viewPagerIndex.setCheckIndex(position - 1);
borderTag = false;
}
}
@Override
public void onPageScrollStateChanged(int state) {
if (borderTag) {
viewPager.setCurrentItem(borderJumpIndex, false);
}
}
对ViewPager设置PagerSelect监听, 在 onPageSelected 中 判断是否 需要跳转
然后 在 onPagerScrollStateChanged 中 根据判断标志 执行跳转操作
3,ViewPager 下标 对应 改变的问题。 ViewPager在设置了PagerSelect监听 后,调用 setCurrentItem() 也会回调 onPageSelected 方法
所以 应该在 onPageSelected中 改变 ViewPager 下标
实现自动滚动,触摸暂停
需对 ViewPager设置 触摸监听,判断是否触摸,然后另外开一个线程每隔一段时间 发送 跳转指令
@Override
public boolean onTouch(View v, MotionEvent event) {
viewPagerTouchTag = true;
return false;
}
public void startLoop() {
if (loopThread != null) {
loopThread.interrupt();
}
loopThread = new Thread() {
@Override
public void run() {
while (true) {
try {
if (!viewPagerTouchTag) {
Thread.sleep(3000);
sendLoopMessage();
} else {
Thread.sleep(5000);
viewPagerTouchTag = false;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
loopThread.start();
}
private void sendLoopMessage() {
runHandler.sendEmptyMessage(1);
}
class RunHandler extends Handler {
@Override
public void handleMessage(Message msg) {
if (viewPagerTouchTag) {
return;
}
int currentItem = viewPager.getCurrentItem();
if (currentItem < viewPager.getAdapter().getCount() - 1) {
currentItem++;
} else {
currentItem = 0;
}
viewPager.setCurrentItem(currentItem);
}
}
效果图: