public Builder(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
      TypedArray a =
          context.obtainStyledAttributes(
              attrs, R.styleable.CheckBoxDrawable, defStyleAttr, defStyleRes);

      width(
          a.getDimensionPixelSize(
              R.styleable.CheckBoxDrawable_cbd_width, ThemeUtil.dpToPx(context, 32)));
      height(
          a.getDimensionPixelSize(
              R.styleable.CheckBoxDrawable_cbd_height, ThemeUtil.dpToPx(context, 32)));
      boxSize(
          a.getDimensionPixelSize(
              R.styleable.CheckBoxDrawable_cbd_boxSize, ThemeUtil.dpToPx(context, 18)));
      cornerRadius(
          a.getDimensionPixelSize(
              R.styleable.CheckBoxDrawable_cbd_cornerRadius, ThemeUtil.dpToPx(context, 2)));
      strokeSize(
          a.getDimensionPixelSize(
              R.styleable.CheckBoxDrawable_cbd_strokeSize, ThemeUtil.dpToPx(context, 2)));
      strokeColor(a.getColorStateList(R.styleable.CheckBoxDrawable_cbd_strokeColor));
      tickColor(a.getColor(R.styleable.CheckBoxDrawable_cbd_tickColor, 0xFFFFFFFF));
      animDuration(
          a.getInt(
              R.styleable.CheckBoxDrawable_cbd_animDuration,
              context.getResources().getInteger(android.R.integer.config_mediumAnimTime)));

      a.recycle();

      if (mStrokeColor == null) {
        int[][] states =
            new int[][] {
              new int[] {-android.R.attr.state_checked}, new int[] {android.R.attr.state_checked},
            };
        int[] colors =
            new int[] {
              ThemeUtil.colorControlNormal(context, 0xFF000000),
              ThemeUtil.colorControlActivated(context, 0xFF000000),
            };
        strokeColor(new ColorStateList(states, colors));
      }
    }
  private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    setWillNotDraw(false);
    setSelector(BlankDrawable.getInstance());
    setCacheColorHint(0);
    setDivider(null);
    setItemsCanFocus(true);
    setFastScrollEnabled(false);
    setVerticalScrollBarEnabled(false);
    setOnScrollListener(this);
    setFadingEdgeLength(0);
    setFrictionIfSupported(ViewConfiguration.getScrollFriction() * mFriction);

    mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    mPaint.setStyle(Paint.Style.FILL);
    mPaint.setTextAlign(Paint.Align.CENTER);

    mDayPadding = ThemeUtil.dpToPx(context, 4);

    mSelectionColor = ThemeUtil.colorPrimary(context, 0xFF000000);

    mCalendar = Calendar.getInstance();
    mFirstDayOfWeek = mCalendar.getFirstDayOfWeek();

    int index = mCalendar.get(Calendar.DAY_OF_WEEK) - 1;
    DateFormat format =
        new SimpleDateFormat(
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 ? "EEEEE" : "E");
    for (int i = 0; i < 7; i++) {
      mLabels[index] = format.format(mCalendar.getTime());
      index = (index + 1) % 7;
      mCalendar.add(Calendar.DAY_OF_MONTH, 1);
    }

    mAdapter = new MonthAdapter();
    setAdapter(mAdapter);

    applyStyle(context, attrs, defStyleAttr, defStyleRes);
  }