ViewPager+MonthDateView实现无限滑动的日历选择器

本文是在一个MonthDateView的基础上修改的Demo(忘记当时下载的地址,以后找到了补上),因公司需求做一个可左右滑动的月份选择器,而原项目因不可滑动,且事务支持类型有限,在源代码上略作修改,基本实现了需求。由于本人不会制作GIF图片,效果图就简单的贴两张,如下:

  • 无限滑动的ViewPager
  • 多事务标识

滑动时静止时

无限滑动的ViewPager

经过几天的研究,发现比较好的实现ViewPager的无限滑动的方式是预先放置3个page页,默认滑动到第二个页面,在左右滑动完成后,将当前的page页设置为第二页,在设置取消掉滑动的动画效果,这样就可以实现ViewPager的无限滑动。以下是代码实现部分:

 /**
         * 设置ViewPage可以无限滑动
         */
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {


            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                Log.i("yuanye", "cyf333 : " + Pageviews.size());
                switch (position) {
                    case 0:
                        mdv0.onLeftClick(year, month, day);
                        break;
                    case 1:
                        /**
                         * 设置当滑动的月份是当前月份的之前月份时,不可滑动
                         */
                        Log.i("yuanye", mdv1.getCurrMonth()+"  " + month);
                        if (mdv1.getCurrentYear() == year && mdv1.getCurrMonth() == month) {
                            Log.i("yuanye", "cyf111 : " + Pageviews.size());
                            Pageviews.remove(2);
                            Log.i("yuanye", "cyf222 : " + Pageviews.size());
                        } else  if(Pageviews.size() == 2) {
                            Pageviews.add(2, page03);
                        }
                        adapter.notifyDataSetChanged();
                        break;
                    case 2:
                        if (mdv2 != null) {
                            mdv2.onRightClick(year, month, day);
                        }
                        break;
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                if (state == 0) {
                    Log.i("yuanye", "12312315");
                    if (viewPager.getCurrentItem() == 1) {
                        return;
                    }
                    if (viewPager.getCurrentItem() > 1) {
                        mdv1.onRightClick(year, month, day);
                        mdv1.setTextView(date_text);
                    } else {
                        mdv1.onLeftClick(year, month, day);
                        mdv1.setTextView(date_text);
                    }
                    year = mdv1.getmSelYear();
                    month = mdv1.getmSelMonth();
                    day = mdv1.getmSelDay();
                    viewPager.setCurrentItem(1, false);
                }
            }

        });

多事务标识

对于事务的颜色标记,首先需要知道的是事务具体的年月日,然后根据不同的事务类型,设置不同的type标记,这样来达到多事务处理标识。主要代码如下:

private void drawCircle(int row, int column, int day, Canvas canvas) {
        if (daysHasThingList != null && daysHasThingList.size() > 0) {
//            if (!daysHasThingList.contains(day)) return;
            for(int i = 0;i<daysHasThingList.size();i++){
                if(daysHasThingList.get(i).getDay()==day){
                    /**
                     * 根据事务的类型,给画笔设置不同的颜色
                     */
                    switch (daysHasThingList.get(i).getType()) {
                        case 1:
                            mPaint.setColor(mHashThinColor1);
                            break;
                        case 2:
                            mPaint.setColor(mHashThinColor2);
                            break;
                        case 3:
                            mPaint.setColor(mHashThinColor3);
                            break;
                    }
                    /**
                     * 如果想设置不同事务标识图标,可在设立设置
                     */
                    float circleX = (float) (mColumnSize * column + mColumnSize * 0.8);
                    float circley = (float) (mRowSize * row + mRowSize * 0.2);
                    canvas.drawCircle(circleX, circley, mCircleRadius, mPaint);
                }
            }
        }
    }

这里主要是逻辑算法的理解,如果有兴趣可以自己看看源码,这里只是简单的实现了需求,由于Demo代码量比较多,这里就不一一粘贴。
点击获取Demo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章