viewpager从入门到精通3 无限轮播viewpager

在上一篇博客 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

GitHub传送门点击这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值