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

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