在上一篇博客 viewpager从入门到精通2 无限数量viewpager 中我们拥有了无限数量的viewpager这篇我们要做个处理让这个无限数量的viewpager变为无限轮播viewpager。让它滑动起来。
我的思路是让handler一直发送消息当接到消息后调用handler.sendMessageDelayed延迟发送消息不断发送消息接受消息接到消息后调用viewpager的setcurrentItem去设置下一个item。
接下来我们来看自定义的viewpager的代码吧。
public class MyViewPager extends ViewPager {
private static final int START_SCROLL_ANIM = 0;//开启滚动处理
private static final int STOP_SCROLL_ANIM = 1;//关闭滚动处理
private static final int LOOP_MESSAGE = 2;//循环消息
MyHeaderPagerHandler handler;
private int changePagerSpeed = 2000;//切换页面速度
private int loopSpeed = 3000;//每个item切换间隔
private boolean ifStopAnim = false;
public MyViewPager(Context context) {
this(context, null);
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
handler = new MyHeaderPagerHandler(new WeakReference<>(this));
}
//滑动控制--------------------------------------------------------------------------------------------------------------------------
public void startScroll() {
ifStopAnim = false;
Message message = new Message();
message.what = START_SCROLL_ANIM;
handler.sendMessage(message);
}
public void startScroll(long delay) {
ifStopAnim = false;
Message message = new Message();
message.what = START_SCROLL_ANIM;
handler.sendMessageDelayed(message, delay);
}
public void stopScroll() {
ifStopAnim = true;
handler.removeCallbacksAndMessages(null);
}
private void loopMessage() {
Message message = new Message();
message.what = LOOP_MESSAGE;
handler.sendMessageDelayed(message, loopSpeed);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
stopScroll();
break;
case MotionEvent.ACTION_UP:
startScroll(6000);
break;
}
return super.onTouchEvent(ev);
}
private static class MyHeaderPagerHandler extends Handler {
private WeakReference<MyViewPager> myPager;
MyHeaderPagerHandler(WeakReference<MyViewPager> myPager) {
this.myPager = myPager;
}
@Override
public void handleMessage(Message msg) {
if (myPager.get() == null) return;
if (myPager.get().ifStopAnim) return;
super.handleMessage(msg);
switch (msg.what) {
case START_SCROLL_ANIM:
myPager.get().loopMessage();
break;
case STOP_SCROLL_ANIM:
break;
case LOOP_MESSAGE:
myPager.get().setCurrentItem(myPager.get().getCurrentItem() + 1, true);
myPager.get().loopMessage();
break;
}
}
}
}
代码不是很多里面有三种消息START_SCROLL_ANIM开始滑动,STOP_SCROLL_ANIM停止滑动,LOOP_MESSAGE不断轮询消息,当接到开始滑动的处理时调用loopMessage的处理接到消息后首先调用viewpager的setCurrentItem然后调用loopMessage继续走下一个处理。STOP_SCROLL_ANIM这里没有做处理大家如果有其他事情要处理可以写到这里面。
下面是activity的调用。
public class MainActivity3 extends AppCompatActivity {
private MyViewPager vp_mian1;
private MyPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
vp_mian1 = findViewById(R.id.vp_mian1);
List<View> itemViews = installItems();
adapter = new MyPagerAdapter(itemViews);
vp_mian1.setAdapter(adapter);
vp_mian1.setCurrentItem(itemViews.size() * 500);
vp_mian1.startScroll();
}
public List<View> installItems() {
List<View> views = new ArrayList<>();
int drawables[] = {R.drawable.d_01, R.drawable.d_02, R.drawable.d_03, R.drawable.d_04, R.drawable.d_05};
for (int i = 0; i < 5; i++) {
RelativeLayout rlHeaderItem = (RelativeLayout) LayoutInflater.from(this).inflate(R.layout.header_pager_view, null);
ImageView ivItem = rlHeaderItem.findViewById(R.id.iv_header_item);
ivItem.setBackgroundDrawable(getResources().getDrawable(drawables[i]));
views.add(rlHeaderItem);
}
return views;
}
@Override
protected void onDestroy() {
vp_mian1.stopScroll();
super.onDestroy();
}
}
在onCreate中调用startScroll开启pager轮询,onDestroy中调用stopScroll停止轮询。
是不是很简单
在这里我们实现了无限轮播的viewpager但是有个问题滑动的切换很生硬不是很美观,在接下来的博客中我们将优化滑动处理让viewpager更美观,链接如下。
viewpager从入门到精通4 优化轮播viewpager ViewPagerScroller PageTransformer