diff --git a/README.md b/README.md index 7ede4df5..4c693241 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,22 @@ # CalenderView +[![](https://jitpack.io/v/michaellee123/CalendarView.svg)](https://jitpack.io/#michaellee123/CalendarView) + +李某人套娃基于[CalenderView](https://github.com/angcyo/CalendarView)`3.7.1.37`的版本修改,实现了滚动年月标题吸顶。如图: + +![](/png/gif_sticky_vertical_scroll.gif) + +吸顶效果使用:[GroupedRecyclerViewAdapter](https://github.com/donkingliang/GroupedRecyclerViewAdapter),感谢🙏 + +使用方法,用`StickyVerticalCalendarView`替换掉原本的`VerticalCalendarView`即可。 + +--- + +分割线 + +--- + 基于[CalenderView](https://github.com/huanghaibin-dev/CalendarView)`3.7.1`的版本修改, 实现了如下功能: - `垂直列表日历`: 基于`RecyclerView`实现 diff --git a/app/src/main/java/com/haibin/calendarviewproject/VerticalActivity.java b/app/src/main/java/com/haibin/calendarviewproject/VerticalActivity.java index d7233c71..c4147caf 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/VerticalActivity.java +++ b/app/src/main/java/com/haibin/calendarviewproject/VerticalActivity.java @@ -10,6 +10,7 @@ import com.haibin.calendarview.BaseMonthView; import com.haibin.calendarview.Calendar; import com.haibin.calendarview.CalendarView; +import com.haibin.calendarview.StickyVerticalCalendarView; import com.haibin.calendarview.VerticalCalendarView; import com.haibin.calendarview.VerticalMonthRecyclerView; import com.haibin.calendarviewproject.base.activity.BaseActivity; @@ -32,7 +33,7 @@ public class VerticalActivity extends BaseActivity implements TextView mTextCurrentDay; - VerticalCalendarView mCalendarView; + StickyVerticalCalendarView mCalendarView; RelativeLayout mRelativeTool; int doCount = 0; diff --git a/app/src/main/java/com/haibin/calendarviewproject/colorful/ColorfulMonthView.java b/app/src/main/java/com/haibin/calendarviewproject/colorful/ColorfulMonthView.java index b62e1715..b1c04436 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/colorful/ColorfulMonthView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/colorful/ColorfulMonthView.java @@ -13,7 +13,7 @@ public class ColorfulMonthView extends MonthView { - private int mRadius; + private float mRadius; public ColorfulMonthView(Context context) { super(context); @@ -21,7 +21,7 @@ public ColorfulMonthView(Context context) { @Override protected void onPreviewHook() { - mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2; + mRadius = (Math.min(mItemWidth, mItemHeight) / 5 * 2); } /** @@ -35,25 +35,25 @@ protected void onPreviewHook() { * @return false 则不绘制onDrawScheme,因为这里背景色是互斥的 */ @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme) { + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); return true; } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y) { + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSchemePaint); } @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { - int cx = x + mItemWidth / 2; - int top = y - mItemHeight / 8; + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { + float cx = x + mItemWidth / 2; + float top = y - mItemHeight / 8; if (isSelected) { canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, calendar.isCurrentDay() ? mCurDayTextPaint : mSelectTextPaint); diff --git a/app/src/main/java/com/haibin/calendarviewproject/colorful/ColorfulWeekView.java b/app/src/main/java/com/haibin/calendarviewproject/colorful/ColorfulWeekView.java index ccdad338..329059c4 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/colorful/ColorfulWeekView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/colorful/ColorfulWeekView.java @@ -1,9 +1,7 @@ package com.haibin.calendarviewproject.colorful; import android.content.Context; -import android.graphics.BlurMaskFilter; import android.graphics.Canvas; -import android.view.View; import com.haibin.calendarview.Calendar; import com.haibin.calendarview.WeekView; @@ -15,7 +13,7 @@ public class ColorfulWeekView extends WeekView { - private int mRadius; + private float mRadius; public ColorfulWeekView(Context context) { super(context); @@ -30,7 +28,7 @@ public ColorfulWeekView(Context context) { @Override protected void onPreviewHook() { - mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2; + mRadius = (Math.min(mItemWidth, mItemHeight) / 5 * 2); } /** @@ -43,26 +41,26 @@ protected void onPreviewHook() { * @return false 则不绘制onDrawScheme,因为这里背景色是互斥的 */ @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme) { + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); return true; } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x) { + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSchemePaint); } @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { - int cx = x + mItemWidth / 2; - int top = -mItemHeight / 8; + protected void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected) { + float cx = x + mItemWidth / 2; + float top = -mItemHeight / 8; if (isSelected) { canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, calendar.isCurrentDay() ? mCurDayTextPaint : mSelectTextPaint); diff --git a/app/src/main/java/com/haibin/calendarviewproject/custom/CustomMonthView.java b/app/src/main/java/com/haibin/calendarviewproject/custom/CustomMonthView.java index 462148ff..639473d6 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/custom/CustomMonthView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/custom/CustomMonthView.java @@ -16,7 +16,7 @@ public class CustomMonthView extends MonthView { - private int mRadius; + private float mRadius; /** * 自定义魅族标记的文本画笔 @@ -102,9 +102,9 @@ protected void onPreviewHook() { @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme) { + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; if (isTouchDown && mCurrentItem == mItems.indexOf(getIndex())) { //点击当前选中的item, 缩放效果提示 canvas.drawCircle(cx, cy, mRadius - dipToPx(getContext(), 4), mSelectedPaint); @@ -115,7 +115,7 @@ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y) { boolean isSelected = isSelected(calendar); if (isSelected) { @@ -129,10 +129,10 @@ protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; - int top = y - mItemHeight / 6; + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; + float top = y - mItemHeight / 6; if (calendar.isCurrentDay() && !isSelected) { canvas.drawCircle(cx, cy, mRadius, mCurrentDayPaint); diff --git a/app/src/main/java/com/haibin/calendarviewproject/custom/CustomWeekView.java b/app/src/main/java/com/haibin/calendarviewproject/custom/CustomWeekView.java index fb15edc6..9ebea140 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/custom/CustomWeekView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/custom/CustomWeekView.java @@ -17,7 +17,7 @@ public class CustomWeekView extends WeekView { - private int mRadius; + private float mRadius; /** * 自定义魅族标记的文本画笔 @@ -105,9 +105,9 @@ protected void onPreviewHook() { @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme) { + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; if (isTouchDown && mCurrentItem == mItems.indexOf(getIndex())) { //点击当前选中的item, 缩放效果提示 @@ -121,7 +121,7 @@ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolea @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x) { boolean isSelected = isSelected(calendar); if (isSelected) { @@ -135,10 +135,10 @@ protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; - int top = -mItemHeight / 6; + protected void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected) { + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; + float top = -mItemHeight / 6; if (calendar.isCurrentDay() && !isSelected) { canvas.drawCircle(cx, cy, mRadius, mCurrentDayPaint); diff --git a/app/src/main/java/com/haibin/calendarviewproject/custom/CustomYearView.java b/app/src/main/java/com/haibin/calendarviewproject/custom/CustomYearView.java index ee2f1966..a52715c5 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/custom/CustomYearView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/custom/CustomYearView.java @@ -47,7 +47,7 @@ public CustomYearView(Context context) { } @Override - protected void onDrawMonth(Canvas canvas, int year, int month, int x, int y, int width, int height) { + protected void onDrawMonth(Canvas canvas, int year, int month, float x, float y, float width, float height) { String text = getContext() .getResources() @@ -82,7 +82,7 @@ private static boolean isLeapYear(int year) { @Override - protected void onDrawWeek(Canvas canvas, int week, int x, int y, int width, int height) { + protected void onDrawWeek(Canvas canvas, int week, float x, float y, float width, float height) { String text = getContext().getResources().getStringArray(com.haibin.calendarview.R.array.year_view_week_string_array)[week]; canvas.drawText(text, x + width / 2, @@ -92,23 +92,23 @@ protected void onDrawWeek(Canvas canvas, int week, int x, int y, int width, int @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; - int radius = Math.min(mItemWidth, mItemHeight) / 8 * 5; + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme) { + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; + float radius = Math.min(mItemWidth, mItemHeight) / 8 * 5; canvas.drawCircle(cx, cy, radius, mSelectedPaint); return true; } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y) { } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine + y; - int cx = x + mItemWidth / 2; + float cx = x + mItemWidth / 2; if (isSelected) { canvas.drawText(String.valueOf(calendar.getDay()), diff --git a/app/src/main/java/com/haibin/calendarviewproject/full/FullMonthView.java b/app/src/main/java/com/haibin/calendarviewproject/full/FullMonthView.java index e429bcee..5d108cab 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/full/FullMonthView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/full/FullMonthView.java @@ -43,6 +43,12 @@ public FullMonthView(Context context) { mSelectedPaint.setMaskFilter(new BlurMaskFilter(50, BlurMaskFilter.Blur.SOLID)); } + @Override + protected void drawCalendar(Canvas canvas, Calendar calendar, float x, float y, boolean isSelected) { + canvas.drawRect(x, y, x + mItemWidth, y + mItemHeight, mRectPaint); + super.drawCalendar(canvas, calendar, x, y, isSelected); + } + /** * 绘制选中的日子 * @@ -54,8 +60,8 @@ public FullMonthView(Context context) { * @return true 则绘制onDrawScheme,因为这里背景色不是是互斥的 */ @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { - canvas.drawRect(x, y , x + mItemWidth, y + mItemHeight, mSelectedPaint); + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme) { + canvas.drawRect(x, y, x + mItemWidth, y + mItemHeight, mSelectedPaint); return true; } @@ -69,24 +75,29 @@ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, */ @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y) { mSchemeBasicPaint.setColor(calendar.getSchemeColor()); List schemes = calendar.getSchemes(); if (schemes == null || schemes.size() == 0) { return; } int space = dipToPx(getContext(), 2); - int indexY = y + mItemHeight - 2 * space; + float indexY = y + mItemHeight - 2 * space; int sw = dipToPx(getContext(), mItemWidth / 10); int sh = dipToPx(getContext(), 4); + //for (Calendar.Scheme scheme : schemes) { + // + // mSchemePaint.setColor(scheme.getShcemeColor()); + // + // canvas.drawRect(x + mItemWidth - sw - 2 * space, + // + // indexY - sh, x + mItemWidth - 2 * space, indexY, mSchemePaint); + // indexY = indexY - space -sh; + //} for (Calendar.Scheme scheme : schemes) { - mSchemePaint.setColor(scheme.getShcemeColor()); - - canvas.drawRect(x + mItemWidth - sw - 2 * space, - - indexY - sh, x + mItemWidth - 2 * space, indexY, mSchemePaint); - indexY = indexY - space -sh; + canvas.drawRect(x, indexY - sh, x + mItemWidth, indexY, mSchemePaint); + indexY = indexY - space - sh; } } @@ -102,10 +113,9 @@ protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { */ @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { - canvas.drawRect(x, y, x + mItemWidth, y + mItemHeight, mRectPaint); - int cx = x + mItemWidth / 2; - int top = y - mItemHeight / 6; + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { + float cx = x + mItemWidth / 2; + float top = y - mItemHeight / 6; boolean isInRange = isInRange(calendar); diff --git a/app/src/main/java/com/haibin/calendarviewproject/full/FullWeekView.java b/app/src/main/java/com/haibin/calendarviewproject/full/FullWeekView.java index a062db7b..356280e7 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/full/FullWeekView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/full/FullWeekView.java @@ -48,7 +48,7 @@ public FullWeekView(Context context) { * @return true 则绘制onDrawScheme,因为这里背景色不是是互斥的 */ @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme) { mSelectedPaint.setStyle(Paint.Style.FILL); canvas.drawRect(x,0, x + mItemWidth, mItemHeight , mSelectedPaint); return true; @@ -56,14 +56,14 @@ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolea @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x) { mSchemeBasicPaint.setColor(calendar.getSchemeColor()); List schemes = calendar.getSchemes(); if (schemes == null || schemes.size() == 0) { return; } int space = dipToPx(getContext(), 2); - int indexY = mItemHeight - 2 * space; + float indexY = mItemHeight - 2 * space; int sw = dipToPx(getContext(), mItemWidth / 10); int sh = dipToPx(getContext(), 4); for (Calendar.Scheme scheme : schemes) { @@ -79,10 +79,10 @@ protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected) { canvas.drawRect(x, 0, x + mItemWidth, mItemHeight, mRectPaint); - int cx = x + mItemWidth / 2; - int top = - mItemHeight / 6; + float cx = x + mItemWidth / 2; + float top = - mItemHeight / 6; boolean isInRange = isInRange(calendar); diff --git a/app/src/main/java/com/haibin/calendarviewproject/index/IndexMonthView.java b/app/src/main/java/com/haibin/calendarviewproject/index/IndexMonthView.java index d46b2bfc..b4646f54 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/index/IndexMonthView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/index/IndexMonthView.java @@ -32,7 +32,7 @@ public IndexMonthView(Context context) { @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme) { mSelectedPaint.setStyle(Paint.Style.FILL); canvas.drawRect(x + mPadding, y + mPadding, x + mItemWidth - mPadding, y + mItemHeight - mPadding, mSelectedPaint); return true; @@ -47,7 +47,7 @@ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, */ @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y) { mSchemeBasicPaint.setColor(calendar.getSchemeColor()); canvas.drawRect(x + mItemWidth / 2 - mW / 2, y + mItemHeight - mH * 2 - mPadding, @@ -57,9 +57,9 @@ protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { - int cx = x + mItemWidth / 2; - int top = y - mItemHeight / 6; + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { + float cx = x + mItemWidth / 2; + float top = y - mItemHeight / 6; if (hasScheme) { canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, calendar.isCurrentDay() ? mCurDayTextPaint : diff --git a/app/src/main/java/com/haibin/calendarviewproject/index/IndexWeekView.java b/app/src/main/java/com/haibin/calendarviewproject/index/IndexWeekView.java index c8f8258f..a1882360 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/index/IndexWeekView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/index/IndexWeekView.java @@ -44,7 +44,7 @@ protected void onPreviewHook() { * @param hasScheme hasScheme 非标记的日期 */ @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme) { mSelectedPaint.setStyle(Paint.Style.FILL); canvas.drawRect(x + mPadding, mPadding, x + mItemWidth - mPadding, mItemHeight - mPadding, mSelectedPaint); return true; @@ -59,7 +59,7 @@ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolea */ @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x) { mSchemeBasicPaint.setColor(calendar.getSchemeColor()); canvas.drawRect(x + mItemWidth / 2 - mW / 2, mItemHeight - mH * 2 - mPadding, @@ -69,9 +69,9 @@ protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { - int cx = x + mItemWidth / 2; - int top = -mItemHeight / 6; + protected void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected) { + float cx = x + mItemWidth / 2; + float top = -mItemHeight / 6; if (hasScheme) { canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, calendar.isCurrentDay() ? mCurDayTextPaint : diff --git a/app/src/main/java/com/haibin/calendarviewproject/mark/MarkMonthView.java b/app/src/main/java/com/haibin/calendarviewproject/mark/MarkMonthView.java index 5010cbe6..fc55400c 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/mark/MarkMonthView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/mark/MarkMonthView.java @@ -25,17 +25,17 @@ protected void onPreviewHook() { } @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme) { return markProperty.onDrawSelected(this, canvas, calendar, x, y, hasScheme); } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y) { markProperty.onDrawScheme(this, canvas, calendar, x, y); } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { markProperty.onDrawText(this, canvas, calendar, x, y, hasScheme, isSelected); } } diff --git a/app/src/main/java/com/haibin/calendarviewproject/mark/MarkProperty.java b/app/src/main/java/com/haibin/calendarviewproject/mark/MarkProperty.java index 3c1a445b..415fa934 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/mark/MarkProperty.java +++ b/app/src/main/java/com/haibin/calendarviewproject/mark/MarkProperty.java @@ -94,7 +94,7 @@ boolean isInPriorityShowWeekMode(BaseView baseView, Calendar calendar) { } @Override - public boolean onDrawSelected(BaseView baseView, Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { + public boolean onDrawSelected(BaseView baseView, Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme) { float cx = x + baseView.mItemWidth / 2f; float cy = y + baseView.mItemHeight / 2f + getOffset(); canvas.drawCircle(cx, cy, schemeRadius, baseView.mSelectedPaint); @@ -102,7 +102,7 @@ public boolean onDrawSelected(BaseView baseView, Canvas canvas, Calendar calenda } @Override - public void onDrawScheme(BaseView baseView, Canvas canvas, Calendar calendar, int x, int y) { + public void onDrawScheme(BaseView baseView, Canvas canvas, Calendar calendar, float x, float y) { float cx = x + baseView.mItemWidth / 2f; float cy = y + baseView.mItemHeight / 2f + getOffset(); @@ -118,7 +118,7 @@ public void onDrawScheme(BaseView baseView, Canvas canvas, Calendar calendar, in } @Override - public void onDrawText(BaseView baseView, Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + public void onDrawText(BaseView baseView, Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { float baselineY = baseView.mTextBaseLine + y + getOffset(); float cx = x + baseView.mItemWidth / 2f; diff --git a/app/src/main/java/com/haibin/calendarviewproject/mark/MarkWeekView.java b/app/src/main/java/com/haibin/calendarviewproject/mark/MarkWeekView.java index 7e276067..94a12239 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/mark/MarkWeekView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/mark/MarkWeekView.java @@ -25,17 +25,17 @@ protected void onPreviewHook() { } @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme) { return markProperty.onDrawSelected(this, canvas, calendar, x, 0, hasScheme); } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x) { markProperty.onDrawScheme(this, canvas, calendar, x, 0); } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected) { markProperty.onDrawText(this, canvas, calendar, x, 0, hasScheme, isSelected); } } diff --git a/app/src/main/java/com/haibin/calendarviewproject/meizu/MeiZuMonthView.java b/app/src/main/java/com/haibin/calendarviewproject/meizu/MeiZuMonthView.java index 9e9d9227..9f41fb38 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/meizu/MeiZuMonthView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/meizu/MeiZuMonthView.java @@ -61,7 +61,7 @@ public MeiZuMonthView(Context context) { * @return true 则绘制onDrawScheme,因为这里背景色不是是互斥的 */ @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme) { mSelectedPaint.setStyle(Paint.Style.FILL); canvas.drawRect(x + mPadding, y + mPadding, x + mItemWidth - mPadding, y + mItemHeight - mPadding, mSelectedPaint); return true; @@ -76,7 +76,7 @@ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, * @param y 日历Card y起点坐标 */ @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y) { mSchemeBasicPaint.setColor(calendar.getSchemeColor()); canvas.drawCircle(x + mItemWidth - mPadding - mRadio / 2, y + mPadding + mRadio, mRadio, mSchemeBasicPaint); @@ -102,9 +102,9 @@ private float getTextWidth(String text) { */ @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { - int cx = x + mItemWidth / 2; - int top = y - mItemHeight / 6; + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { + float cx = x + mItemWidth / 2; + float top = y - mItemHeight / 6; boolean isInRange = isInRange(calendar); diff --git a/app/src/main/java/com/haibin/calendarviewproject/meizu/MeizuWeekView.java b/app/src/main/java/com/haibin/calendarviewproject/meizu/MeizuWeekView.java index 4ae3ed41..48fbceaf 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/meizu/MeizuWeekView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/meizu/MeizuWeekView.java @@ -47,14 +47,14 @@ public MeizuWeekView(Context context) { * @return true 则绘制onDrawScheme,因为这里背景色不是是互斥的 */ @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme) { mSelectedPaint.setStyle(Paint.Style.FILL); canvas.drawRect(x + mPadding, mPadding, x + mItemWidth - mPadding, mItemHeight - mPadding, mSelectedPaint); return true; } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x) { mSchemeBasicPaint.setColor(calendar.getSchemeColor()); canvas.drawCircle(x + mItemWidth - mPadding - mRadio / 2, mPadding + mRadio, mRadio, mSchemeBasicPaint); @@ -70,9 +70,9 @@ private float getTextWidth(String text) { @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { - int cx = x + mItemWidth / 2; - int top = -mItemHeight / 6; + protected void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected) { + float cx = x + mItemWidth / 2; + float top = -mItemHeight / 6; boolean isInRange = isInRange(calendar); diff --git a/app/src/main/java/com/haibin/calendarviewproject/mix/MixMonthView.java b/app/src/main/java/com/haibin/calendarviewproject/mix/MixMonthView.java index 8555f478..2f7fd0c0 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/mix/MixMonthView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/mix/MixMonthView.java @@ -17,7 +17,7 @@ public class MixMonthView extends MonthView { - private int mRadius; + private float mRadius; /** * 自定义魅族标记的文本画笔 @@ -115,7 +115,7 @@ protected void onDraw(Canvas canvas) { mYear, mMonth, CalendarUtil.getMonthDaysCount(mYear, mMonth), getWeekStartWith()); int width = dipToPx(getContext(), 52);//left-padding int cx = width / 2; - int cy = 0; + float cy = 0; for (int w = weekStart; w <= weekEnd; w++) { @@ -127,15 +127,15 @@ protected void onDraw(Canvas canvas) { } @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme) { + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); return true; } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y) { boolean isSelected = isSelected(calendar); if (isSelected) { @@ -149,10 +149,10 @@ protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; - int top = y - mItemHeight / 6; + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; + float top = y - mItemHeight / 6; if (calendar.isCurrentDay() && !isSelected) { canvas.drawCircle(cx, cy, mRadius, mCurrentDayPaint); diff --git a/app/src/main/java/com/haibin/calendarviewproject/mix/MixWeekView.java b/app/src/main/java/com/haibin/calendarviewproject/mix/MixWeekView.java index 5b73547b..089bca17 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/mix/MixWeekView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/mix/MixWeekView.java @@ -18,7 +18,7 @@ public class MixWeekView extends WeekView { - private int mRadius; + private float mRadius; /** * 自定义魅族标记的文本画笔 @@ -129,16 +129,16 @@ protected void onPreviewHook() { @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme) { + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); return true; } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x) { boolean isSelected = isSelected(calendar); if (isSelected) { @@ -152,10 +152,10 @@ protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; - int top = -mItemHeight / 6; + protected void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected) { + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; + float top = -mItemHeight / 6; if (calendar.isCurrentDay() && !isSelected) { canvas.drawCircle(cx, cy, mRadius, mCurrentDayPaint); diff --git a/app/src/main/java/com/haibin/calendarviewproject/multi/CustomMultiMonthView.java b/app/src/main/java/com/haibin/calendarviewproject/multi/CustomMultiMonthView.java index d3dcd2c9..7c5c99d1 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/multi/CustomMultiMonthView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/multi/CustomMultiMonthView.java @@ -14,7 +14,7 @@ public class CustomMultiMonthView extends MultiMonthView { - private int mRadius; + private float mRadius; public CustomMultiMonthView(Context context) { super(context); @@ -28,10 +28,10 @@ protected void onPreviewHook() { } @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelectedPre, boolean isSelectedNext) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; if (isSelectedPre) { if (isSelectedNext) { canvas.drawRect(x, cy - mRadius, x + mItemWidth, cy + mRadius, mSelectedPaint); @@ -51,16 +51,16 @@ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y, boolean isSelected) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y, boolean isSelected) { + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSchemePaint); } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine + y; - int cx = x + mItemWidth / 2; + float cx = x + mItemWidth / 2; boolean isInRange = isInRange(calendar); boolean isEnable = !onCalendarIntercept(calendar); diff --git a/app/src/main/java/com/haibin/calendarviewproject/multi/CustomMultiWeekView.java b/app/src/main/java/com/haibin/calendarviewproject/multi/CustomMultiWeekView.java index 6dd7c74e..c60ef1af 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/multi/CustomMultiWeekView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/multi/CustomMultiWeekView.java @@ -13,7 +13,7 @@ */ public class CustomMultiWeekView extends MultiWeekView { - private int mRadius; + private float mRadius; public CustomMultiWeekView(Context context) { super(context); @@ -27,10 +27,10 @@ protected void onPreviewHook() { @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme, + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelectedPre, boolean isSelectedNext) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; if (isSelectedPre) { if (isSelectedNext) { @@ -50,16 +50,16 @@ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolea } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, boolean isSelected) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, boolean isSelected) { + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSchemePaint); } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine; - int cx = x + mItemWidth / 2; + float cx = x + mItemWidth / 2; boolean isInRange = isInRange(calendar); boolean isEnable = !onCalendarIntercept(calendar); if (isSelected) { diff --git a/app/src/main/java/com/haibin/calendarviewproject/progress/ProgressMonthView.java b/app/src/main/java/com/haibin/calendarviewproject/progress/ProgressMonthView.java index 6ccb9a02..51be1d8d 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/progress/ProgressMonthView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/progress/ProgressMonthView.java @@ -17,7 +17,7 @@ public class ProgressMonthView extends MonthView { private Paint mProgressPaint = new Paint(); private Paint mNoneProgressPaint = new Paint(); - private int mRadius; + private float mRadius; public ProgressMonthView(Context context) { super(context); @@ -39,17 +39,17 @@ protected void onPreviewHook() { } @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme) { + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); return false; } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y) { + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; int angle = 0; @@ -68,9 +68,9 @@ protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine + y; - int cx = x + mItemWidth / 2; + float cx = x + mItemWidth / 2; if (isSelected) { canvas.drawText(String.valueOf(calendar.getDay()), diff --git a/app/src/main/java/com/haibin/calendarviewproject/progress/ProgressWeekView.java b/app/src/main/java/com/haibin/calendarviewproject/progress/ProgressWeekView.java index 9b42318a..15408d2d 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/progress/ProgressWeekView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/progress/ProgressWeekView.java @@ -17,7 +17,7 @@ public class ProgressWeekView extends WeekView { private Paint mProgressPaint = new Paint(); private Paint mNoneProgressPaint = new Paint(); - private int mRadius; + private float mRadius; public ProgressWeekView(Context context) { super(context); @@ -38,17 +38,17 @@ protected void onPreviewHook() { } @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme) { + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); return false; } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x) { + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; int angle = getAngle(Integer.parseInt(calendar.getScheme())); @@ -60,9 +60,9 @@ protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine; - int cx = x + mItemWidth / 2; + float cx = x + mItemWidth / 2; if (isSelected) { canvas.drawText(String.valueOf(calendar.getDay()), diff --git a/app/src/main/java/com/haibin/calendarviewproject/range/CustomRangeMonthView.java b/app/src/main/java/com/haibin/calendarviewproject/range/CustomRangeMonthView.java index 3df278d7..7057e153 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/range/CustomRangeMonthView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/range/CustomRangeMonthView.java @@ -14,7 +14,7 @@ public class CustomRangeMonthView extends RangeMonthView { - private int mRadius; + private float mRadius; public CustomRangeMonthView(Context context) { super(context); @@ -28,10 +28,10 @@ protected void onPreviewHook() { } @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelectedPre, boolean isSelectedNext) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; if (isSelectedPre) { if (isSelectedNext) { canvas.drawRect(x, cy - mRadius, x + mItemWidth, cy + mRadius, mSelectedPaint); @@ -51,16 +51,16 @@ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y, boolean isSelected) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y, boolean isSelected) { + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSchemePaint); } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine + y; - int cx = x + mItemWidth / 2; + float cx = x + mItemWidth / 2; boolean isInRange = isInRange(calendar); boolean isEnable = !onCalendarIntercept(calendar); diff --git a/app/src/main/java/com/haibin/calendarviewproject/range/CustomRangeWeekView.java b/app/src/main/java/com/haibin/calendarviewproject/range/CustomRangeWeekView.java index df86001e..41e16ea1 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/range/CustomRangeWeekView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/range/CustomRangeWeekView.java @@ -14,7 +14,7 @@ public class CustomRangeWeekView extends RangeWeekView { - private int mRadius; + private float mRadius; public CustomRangeWeekView(Context context) { super(context); @@ -28,10 +28,10 @@ protected void onPreviewHook() { @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme, + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelectedPre, boolean isSelectedNext) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; if (isSelectedPre) { if (isSelectedNext) { @@ -51,16 +51,16 @@ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolea } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, boolean isSelected) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, boolean isSelected) { + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSchemePaint); } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine; - int cx = x + mItemWidth / 2; + float cx = x + mItemWidth / 2; boolean isInRange = isInRange(calendar); boolean isEnable = !onCalendarIntercept(calendar); if (isSelected) { diff --git a/app/src/main/java/com/haibin/calendarviewproject/simple/SimpleMonthView.java b/app/src/main/java/com/haibin/calendarviewproject/simple/SimpleMonthView.java index d4fb782c..a17e1b4e 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/simple/SimpleMonthView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/simple/SimpleMonthView.java @@ -14,7 +14,7 @@ public class SimpleMonthView extends MonthView { - private int mRadius; + private float mRadius; public SimpleMonthView(Context context) { super(context); @@ -27,29 +27,29 @@ protected void onPreviewHook() { } @Override - protected void onLoopStart(int x, int y) { + protected void onLoopStart(float x, float y) { } @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme) { + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); return false; } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y) { + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSchemePaint); } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine + y; - int cx = x + mItemWidth / 2; + float cx = x + mItemWidth / 2; if (isSelected) { canvas.drawText(String.valueOf(calendar.getDay()), diff --git a/app/src/main/java/com/haibin/calendarviewproject/simple/SimpleWeekView.java b/app/src/main/java/com/haibin/calendarviewproject/simple/SimpleWeekView.java index f39f9488..a0598233 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/simple/SimpleWeekView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/simple/SimpleWeekView.java @@ -13,7 +13,7 @@ */ public class SimpleWeekView extends WeekView { - private int mRadius; + private float mRadius; public SimpleWeekView(Context context) { @@ -27,24 +27,24 @@ protected void onPreviewHook() { } @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme) { + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); return false; } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x) { + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSchemePaint); } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine; - int cx = x + mItemWidth / 2; + float cx = x + mItemWidth / 2; if (isSelected) { canvas.drawText(String.valueOf(calendar.getDay()), cx, diff --git a/app/src/main/java/com/haibin/calendarviewproject/single/SingleMonthView.java b/app/src/main/java/com/haibin/calendarviewproject/single/SingleMonthView.java index 721987c5..e32c134d 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/single/SingleMonthView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/single/SingleMonthView.java @@ -16,9 +16,9 @@ public class SingleMonthView extends MonthView { - private int mRadius; + private float mRadius; private Paint mRingPaint = new Paint(); - private int mRingRadius; + private float mRingRadius; /** * 不可用画笔 @@ -64,10 +64,10 @@ protected void onPreviewHook() { * @return false 则不绘制onDrawScheme,因为这里背景色是互斥的 */ @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); canvas.drawCircle(cx, cy, mRingRadius, mRingPaint); @@ -76,16 +76,16 @@ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y) { // int cx = x + mItemWidth / 2; // int cy = y + mItemHeight / 2; //canvas.drawCircle(cx, cy, mRadius, mSchemePaint); } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine + y - dipToPx(getContext(),1); - int cx = x + mItemWidth / 2; + float cx = x + mItemWidth / 2; if (isSelected) { canvas.drawText(calendar.isCurrentDay() ? "今" : "选", cx, diff --git a/app/src/main/java/com/haibin/calendarviewproject/single/SingleWeekView.java b/app/src/main/java/com/haibin/calendarviewproject/single/SingleWeekView.java index eee75ddc..8eb93ae6 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/single/SingleWeekView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/single/SingleWeekView.java @@ -16,9 +16,9 @@ public class SingleWeekView extends WeekView { - private int mRadius; + private float mRadius; private Paint mRingPaint = new Paint(); - private int mRingRadius; + private float mRingRadius; /** * 不可用画笔 @@ -62,9 +62,9 @@ protected void onPreviewHook() { * @return false 则不绘制onDrawScheme,因为这里背景色是互斥的 */ @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme) { + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); canvas.drawCircle(cx, cy, mRingRadius, mRingPaint); return true; @@ -72,16 +72,16 @@ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolea @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x) { // int cx = x + mItemWidth / 2; // int cy = mItemHeight / 2; //canvas.drawCircle(cx, cy, mRadius, mSchemePaint); } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine - dipToPx(getContext(), 1); - int cx = x + mItemWidth / 2; + float cx = x + mItemWidth / 2; if (isSelected) { canvas.drawText(calendar.isCurrentDay() ? "今" : "选", cx, diff --git a/app/src/main/java/com/haibin/calendarviewproject/solay/SolarMonthView.java b/app/src/main/java/com/haibin/calendarviewproject/solay/SolarMonthView.java index de428094..6a7da1b0 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/solay/SolarMonthView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/solay/SolarMonthView.java @@ -21,7 +21,7 @@ public class SolarMonthView extends MonthView { private Paint mPointPaint = new Paint(); - private int mRadius; + private float mRadius; private int mPointRadius; public SolarMonthView(Context context) { @@ -44,17 +44,17 @@ protected void onPreviewHook() { } @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme) { + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); return false; } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { - int cx = x + mItemWidth / 2; - int cy = y + mItemHeight / 2; + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y) { + float cx = x + mItemWidth / 2; + float cy = y + mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSchemePaint); List schemes = calendar.getSchemes(); @@ -77,9 +77,9 @@ protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine + y; - int cx = x + mItemWidth / 2; + float cx = x + mItemWidth / 2; if (isSelected) { canvas.drawText(String.valueOf(calendar.getDay()), diff --git a/app/src/main/java/com/haibin/calendarviewproject/solay/SolarWeekView.java b/app/src/main/java/com/haibin/calendarviewproject/solay/SolarWeekView.java index aacad281..7eb5b20e 100644 --- a/app/src/main/java/com/haibin/calendarviewproject/solay/SolarWeekView.java +++ b/app/src/main/java/com/haibin/calendarviewproject/solay/SolarWeekView.java @@ -20,7 +20,7 @@ public class SolarWeekView extends WeekView { private Paint mPointPaint = new Paint(); - private int mRadius; + private float mRadius; private int mPointRadius; public SolarWeekView(Context context) { @@ -43,17 +43,17 @@ protected void onPreviewHook() { @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme) { + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); return false; } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { - int cx = x + mItemWidth / 2; - int cy = mItemHeight / 2; + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x) { + float cx = x + mItemWidth / 2; + float cy = mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSchemePaint); List schemes = calendar.getSchemes(); @@ -75,9 +75,9 @@ protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine; - int cx = x + mItemWidth / 2; + float cx = x + mItemWidth / 2; if (isSelected) { canvas.drawText(String.valueOf(calendar.getDay()), cx, diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 1965ff3e..09503044 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#ffffff" + android:background="@color/content_background" android:fitsSystemWindows="true" android:orientation="vertical" tools:context="com.haibin.calendarviewproject.MainActivity" @@ -122,7 +122,6 @@ android:id="@+id/calendarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="#fff" android:orientation="vertical" app:calendar_content_view_id="@+id/nestedScrollView" app:calendar_show_mode="both_month_week_view"> diff --git a/app/src/main/res/layout/activity_vertical.xml b/app/src/main/res/layout/activity_vertical.xml index da972828..9f07b143 100644 --- a/app/src/main/res/layout/activity_vertical.xml +++ b/app/src/main/res/layout/activity_vertical.xml @@ -72,7 +72,7 @@ android:layout_gravity="center" android:layout_marginTop="2dp" android:gravity="center" - android:padding="8dp" + android:padding="16dp" android:text="切" android:textColor="#000000" android:textSize="12sp" /> @@ -84,7 +84,7 @@ android:layout_gravity="center" android:layout_marginTop="2dp" android:gravity="center" - android:padding="8dp" + android:padding="16dp" android:text="上" android:textColor="#000000" android:textSize="12sp" /> @@ -96,15 +96,15 @@ android:layout_gravity="center" android:layout_marginTop="2dp" android:gravity="center" - android:padding="8dp" + android:padding="16dp" android:text="下" android:textColor="#000000" android:textSize="12sp" /> @@ -115,7 +115,7 @@ android:contentDescription="@string/app_name" android:scaleType="centerInside" android:src="@mipmap/ic_calendar" - android:tint="#000000" /> + app:tint="#000000" /> - = 7) { indexX = 6; } - int indexY = (int) mY / mItemHeight; - int position = indexY * 7 + indexX;// 选择项 + int indexY = (int) (mY / mItemHeight); + int position = indexY * 7 + indexX; if (position >= 0 && position < mItems.size()) { return mItems.get(position); } @@ -150,11 +149,11 @@ private void onClickCalendarPadding() { return; } Calendar calendar = null; - int indexX = (int) (mX - mDelegate.getCalendarPaddingLeft()) / mItemWidth; + int indexX = (int) ((mX - mDelegate.getCalendarPaddingLeft()) / mItemWidth); if (indexX >= 7) { indexX = 6; } - int indexY = (int) mY / mItemHeight; + int indexY = (int) (mY / mItemHeight); int position = indexY * 7 + indexX;// 选择项 if (position >= 0 && position < mItems.size()) { calendar = mItems.get(position); @@ -214,7 +213,7 @@ final void updateWeekStart() { @Override void updateItemHeight() { super.updateItemHeight(); - int newHeight = CalendarUtil.getMonthViewHeight(mYear, mMonth, mItemHeight, + float newHeight = CalendarUtil.getMonthViewHeight(mYear, mMonth, mItemHeight, mDelegate.getWeekStart(), mDelegate); if (mHeight != newHeight) { requestLayout(); @@ -249,7 +248,7 @@ protected final int getSelectedIndex(Calendar calendar) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (mLineCount != 0) { - heightMeasureSpec = MeasureSpec.makeMeasureSpec(mHeight, MeasureSpec.EXACTLY); + heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) mHeight, MeasureSpec.EXACTLY); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @@ -273,7 +272,7 @@ protected void onPreviewHook() { * @param x 日历Card x起点坐标 * @param y 日历Card y起点坐标 */ - protected void onLoopStart(int x, int y) { + protected void onLoopStart(float x, float y) { // TODO: 2017/11/16 } diff --git a/calendarview/src/main/java/com/haibin/calendarview/BaseView.java b/calendarview/src/main/java/com/haibin/calendarview/BaseView.java index b3ca8bc6..895b72ff 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/BaseView.java +++ b/calendarview/src/main/java/com/haibin/calendarview/BaseView.java @@ -112,12 +112,12 @@ public abstract class BaseView extends View implements View.OnClickListener, Vie /** * 每一项的高度 */ - public int mItemHeight; + public float mItemHeight; /** * 每一项的宽度 */ - public int mItemWidth; + public float mItemWidth; /** * Text的基线 @@ -459,12 +459,12 @@ protected int getWeekStartWith() { } - protected int getCalendarPaddingLeft() { + protected float getCalendarPaddingLeft() { return mDelegate != null ? mDelegate.getCalendarPaddingLeft() : 0; } - protected int getCalendarPaddingRight() { + protected float getCalendarPaddingRight() { return mDelegate != null ? mDelegate.getCalendarPaddingRight() : 0; } diff --git a/calendarview/src/main/java/com/haibin/calendarview/BaseWeekView.java b/calendarview/src/main/java/com/haibin/calendarview/BaseWeekView.java index 1db6622a..72855272 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/BaseWeekView.java +++ b/calendarview/src/main/java/com/haibin/calendarview/BaseWeekView.java @@ -164,12 +164,12 @@ protected Calendar getIndex() { return null; } - int indexX = (int) (mX - mDelegate.getCalendarPaddingLeft()) / mItemWidth; + int indexX = (int) ((mX - mDelegate.getCalendarPaddingLeft()) / mItemWidth); if (indexX >= 7) { indexX = 6; } - int indexY = (int) mY / mItemHeight; - int position = indexY * 7 + indexX;// 选择项 + int indexY = (int) (mY / mItemHeight); + int position = indexY * 7 + indexX; if (position >= 0 && position < mItems.size()) return mItems.get(position); return null; @@ -181,11 +181,11 @@ private void onClickCalendarPadding() { return; } Calendar calendar = null; - int indexX = (int) (mX - mDelegate.getCalendarPaddingLeft()) / mItemWidth; + int indexX = (int) ((mX - mDelegate.getCalendarPaddingLeft()) / mItemWidth); if (indexX >= 7) { indexX = 6; } - int indexY = (int) mY / mItemHeight; + int indexY = (int) (mY / mItemHeight); int position = indexY * 7 + indexX;// 选择项 if (position >= 0 && position < mItems.size()) { calendar = mItems.get(position); @@ -260,7 +260,7 @@ void updateCurrentDate() { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - heightMeasureSpec = MeasureSpec.makeMeasureSpec(mItemHeight, MeasureSpec.EXACTLY); + heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) mItemHeight, MeasureSpec.EXACTLY); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @@ -283,7 +283,7 @@ protected void onPreviewHook() { * @param x 日历Card x起点坐标 */ @SuppressWarnings("unused") - protected void onLoopStart(int x) { + protected void onLoopStart(float x) { // TODO: 2017/11/16 } diff --git a/calendarview/src/main/java/com/haibin/calendarview/CalendarLayout.java b/calendarview/src/main/java/com/haibin/calendarview/CalendarLayout.java index 1ede6a72..8f17998e 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/CalendarLayout.java +++ b/calendarview/src/main/java/com/haibin/calendarview/CalendarLayout.java @@ -121,17 +121,17 @@ public class CalendarLayout extends LinearLayout { /** * 默认手势 */ - private static final int GESTURE_MODE_DEFAULT = 0; + public static final int GESTURE_MODE_DEFAULT = 0; // /** // * 仅日历有效 // */ -// private static final int GESTURE_MODE_ONLY_CALENDAR = 1; +// public static final int GESTURE_MODE_ONLY_CALENDAR = 1; /** * 禁用手势 */ - private static final int GESTURE_MODE_DISABLED = 2; + public static final int GESTURE_MODE_DISABLED = 2; /** * 手势模式 @@ -141,8 +141,8 @@ public class CalendarLayout extends LinearLayout { private int mCalendarShowMode; - private int mContentViewTranslateY; //ContentView 可滑动的最大距离距离 , 固定 - private int mViewPagerTranslateY = 0;// ViewPager可以平移的距离,不代表mMonthView的平移距离 + private float mContentViewTranslateY; //ContentView 可滑动的最大距离距离 , 固定 + private float mViewPagerTranslateY = 0;// ViewPager可以平移的距离,不代表mMonthView的平移距离 private float downY; private float mLastY; @@ -160,7 +160,7 @@ public class CalendarLayout extends LinearLayout { private VelocityTracker mVelocityTracker; private int mMaximumVelocity; - private int mItemHeight; + private float mItemHeight; private CalendarViewDelegate mDelegate; @@ -546,20 +546,20 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int year = mDelegate.mIndexCalendar.getYear(); int month = mDelegate.mIndexCalendar.getMonth(); - int weekBarHeight = CalendarUtil.dipToPx(getContext(), 1) + float weekBarHeight = CalendarUtil.dipToPx(getContext(), 1) + mDelegate.getWeekBarHeight(); - int monthHeight = CalendarUtil.getMonthViewHeight(year, month, + float monthHeight = CalendarUtil.getMonthViewHeight(year, month, mDelegate.getCalendarItemHeight(), mDelegate.getWeekStart(), mDelegate) + weekBarHeight; - int height = MeasureSpec.getSize(heightMeasureSpec); + float height = MeasureSpec.getSize(heightMeasureSpec); if (mDelegate.isFullScreenCalendar()) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); - int heightSpec = MeasureSpec.makeMeasureSpec(height - weekBarHeight - mDelegate.getCalendarItemHeight(), + int heightSpec = MeasureSpec.makeMeasureSpec((int) (height - weekBarHeight - mDelegate.getCalendarItemHeight()), MeasureSpec.EXACTLY); mContentView.measure(widthMeasureSpec, heightSpec); mContentView.layout(mContentView.getLeft(), mContentView.getTop(), mContentView.getRight(), mContentView.getBottom()); @@ -568,14 +568,14 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (monthHeight >= height && mMonthView.getHeight() > 0) { height = monthHeight; - heightMeasureSpec = MeasureSpec.makeMeasureSpec(monthHeight + - weekBarHeight + - mDelegate.getWeekBarHeight(), MeasureSpec.EXACTLY); + heightMeasureSpec = MeasureSpec.makeMeasureSpec( + (int) (monthHeight + weekBarHeight + mDelegate.getWeekBarHeight()), + MeasureSpec.EXACTLY); } else if (monthHeight < height && mMonthView.getHeight() > 0) { - heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); + heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) height, MeasureSpec.EXACTLY); } - int h; + float h; if (mCalendarShowMode == CALENDAR_SHOW_MODE_ONLY_MONTH_VIEW || mCalendarView.getVisibility() == GONE) { h = height - (mCalendarView.getVisibility() == GONE ? 0 : mCalendarView.getHeight()); @@ -589,8 +589,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { h = height - weekBarHeight - mItemHeight; } super.onMeasure(widthMeasureSpec, heightMeasureSpec); - int heightSpec = MeasureSpec.makeMeasureSpec(h, - MeasureSpec.EXACTLY); + int heightSpec = MeasureSpec.makeMeasureSpec((int) h, MeasureSpec.EXACTLY); mContentView.measure(widthMeasureSpec, heightSpec); mContentView.layout(mContentView.getLeft(), mContentView.getTop(), mContentView.getRight(), mContentView.getBottom()); } @@ -951,11 +950,15 @@ public void onAnimationEnd(Animator animation) { @SuppressWarnings("unused") - private int getCalendarViewHeight() { + private float getCalendarViewHeight() { return mMonthView.getVisibility() == VISIBLE ? mDelegate.getWeekBarHeight() + mMonthView.getHeight() : mDelegate.getWeekBarHeight() + mDelegate.getCalendarItemHeight(); } + public void setGestureMode(int gestureMode) { + mGestureMode = gestureMode; + } + /** * 如果有十分特别的ContentView,可以自定义实现这个接口 */ diff --git a/calendarview/src/main/java/com/haibin/calendarview/CalendarUtil.java b/calendarview/src/main/java/com/haibin/calendarview/CalendarUtil.java index 258c53da..6edd082a 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/CalendarUtil.java +++ b/calendarview/src/main/java/com/haibin/calendarview/CalendarUtil.java @@ -102,7 +102,7 @@ public static int getMonthViewLineCount(int year, int month, int weekStartWith, return (preDiff + monthDayCount + nextDiff) / 7; } - private static int getMonthViewHeight(CalendarViewDelegate delegate, int year, int month, int itemHeight, int weekStartWith) { + private static float getMonthViewHeight(CalendarViewDelegate delegate, int year, int month, float itemHeight, int weekStartWith) { java.util.Calendar date = java.util.Calendar.getInstance(); date.set(year, month - 1, 1, 12, 0, 0); int preDiff = getMonthViewStartDiff(year, month, weekStartWith); @@ -111,7 +111,7 @@ private static int getMonthViewHeight(CalendarViewDelegate delegate, int year, i return (preDiff + monthDaysCount + nextDiff) / 7 * itemHeight; } - private static int getMonthViewHeightWeekMode(CalendarViewDelegate delegate, int year, int month, int itemHeight, int weekStartWith) { + private static int getMonthViewHeightWeekMode(CalendarViewDelegate delegate, int year, int month, float itemHeight, int weekStartWith) { int preDiff = getMonthCurrentDayStartDiff(delegate, year, month, weekStartWith); int monthDaysCount = delegate.mCurrentDate.getDay(); int nextDiff = getMonthCurrentDayEndDiff(delegate, year, month, weekStartWith); @@ -128,7 +128,7 @@ private static int getMonthViewHeightWeekMode(CalendarViewDelegate delegate, int * @param weekStartWith 周起始 * @return 不需要多余行的高度 */ - public static int calcMonthViewHeight(int year, int month, int itemHeight, CalendarViewDelegate delegate) { + public static float calcMonthViewHeight(int year, int month, float itemHeight, CalendarViewDelegate delegate) { int weekStartWith = delegate.getWeekStart(); boolean isCurrentMonth = CalendarUtil.isCurrentMonth(delegate, year, month); boolean priorityWeekMode = delegate.monthPriorityShowWeekMode && isCurrentMonth; @@ -149,7 +149,7 @@ public static int calcMonthViewHeight(int year, int month, int itemHeight, Calen * @param mode mode * @return 不需要多余行的高度 */ - public static int getMonthViewHeight(int year, int month, int itemHeight, int weekStartWith, CalendarViewDelegate delegate) { + public static float getMonthViewHeight(int year, int month, float itemHeight, int weekStartWith, CalendarViewDelegate delegate) { int mode = delegate.getMonthViewShowMode(); boolean isCurrentMonth = CalendarUtil.isCurrentMonth(delegate, year, month); boolean priorityWeekMode = delegate.monthPriorityShowWeekMode && isCurrentMonth; diff --git a/calendarview/src/main/java/com/haibin/calendarview/CalendarView.java b/calendarview/src/main/java/com/haibin/calendarview/CalendarView.java index b007a9eb..657290c0 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/CalendarView.java +++ b/calendarview/src/main/java/com/haibin/calendarview/CalendarView.java @@ -17,7 +17,10 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; import android.content.Context; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.os.Parcelable; import android.util.AttributeSet; @@ -28,6 +31,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager.widget.ViewPager; import java.lang.reflect.Constructor; @@ -126,9 +130,9 @@ protected void init(Context context, @Nullable AttributeSet attrs) { this.mWeekLine = findViewById(R.id.line); this.mWeekLine.setBackgroundColor(mDelegate.getWeekLineBackground()); LayoutParams lineParams = (LayoutParams) this.mWeekLine.getLayoutParams(); - lineParams.setMargins(mDelegate.getWeekLineMargin(), - mDelegate.getWeekBarHeight(), - mDelegate.getWeekLineMargin(), + lineParams.setMargins((int) mDelegate.getWeekLineMargin(), + (int) mDelegate.getWeekBarHeight(), + (int) mDelegate.getWeekLineMargin(), 0); this.mWeekLine.setLayoutParams(lineParams); @@ -136,12 +140,11 @@ protected void init(Context context, @Nullable AttributeSet attrs) { this.mMonthPager.mWeekPager = mWeekPager; this.mMonthPager.mWeekBar = mWeekBar; LayoutParams params = (LayoutParams) this.mMonthPager.getLayoutParams(); - params.setMargins(0, mDelegate.getWeekBarHeight() + CalendarUtil.dipToPx(context, 1), 0, 0); + params.setMargins(0, (int) mDelegate.getWeekBarHeight() + CalendarUtil.dipToPx(context, 1), 0, 0); mWeekPager.setLayoutParams(params); - mYearViewPager = findViewById(R.id.selectLayout); - mYearViewPager.setPadding(mDelegate.getYearViewPaddingLeft(), 0, mDelegate.getYearViewPaddingRight(), 0); + mYearViewPager.setPadding((int) mDelegate.getYearViewPaddingLeft(), 0, (int) mDelegate.getYearViewPaddingRight(), 0); mYearViewPager.setBackgroundColor(mDelegate.getYearViewBackground()); mYearViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override @@ -352,6 +355,43 @@ public void onAnimationEnd(Animator animation) { } }); + //颜色值过度 + if (getBackground() != null && getBackground() instanceof ColorDrawable) { + final int intBgColor = ((ColorDrawable) getBackground()).getColor(); + final String bgColor = "#" + Integer.toHexString(intBgColor); + final ValueAnimator animator = ValueAnimator.ofFloat(0.2f, 1f); + animator.setDuration(260); + animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + setBackgroundColor(Color.parseColor(caculateColor(bgColor, "#" + Integer.toHexString(mDelegate.getYearViewBackground()), (Float) animation.getAnimatedValue()))); + } + }); + animator.addListener(new Animator.AnimatorListener() { + + @Override + public void onAnimationStart(Animator animation) { + + } + + @Override + public void onAnimationEnd(Animator animation) { + setBackgroundColor(intBgColor); + } + + @Override + public void onAnimationCancel(Animator animation) { + + } + + @Override + public void onAnimationRepeat(Animator animation) { + + } + }); + animator.start(); + } + mMonthPager.animate() .scaleX(0) .scaleY(0) @@ -368,6 +408,47 @@ public void onAnimationEnd(Animator animation) { }); } + /** + * 计算从startColor过度到endColor过程中百分比为franch时的颜色值 + * + * @param startColor 起始颜色 (格式#FFFFFFFF) + * @param endColor 结束颜色 (格式#FFFFFFFF) + * @param franch 百分比0.5 + * @return 返回String格式的color(格式#FFFFFFFF) + */ + public static String caculateColor(String startColor, String endColor, float franch) { + + int startAlpha = Integer.parseInt(startColor.substring(1, 3), 16); + int startRed = Integer.parseInt(startColor.substring(3, 5), 16); + int startGreen = Integer.parseInt(startColor.substring(5, 7), 16); + int startBlue = Integer.parseInt(startColor.substring(7), 16); + + int endAlpha = Integer.parseInt(endColor.substring(1, 3), 16); + int endRed = Integer.parseInt(endColor.substring(3, 5), 16); + int endGreen = Integer.parseInt(endColor.substring(5, 7), 16); + int endBlue = Integer.parseInt(endColor.substring(7), 16); + + int currentAlpha = (int) ((endAlpha - startAlpha) * franch + startAlpha); + int currentRed = (int) ((endRed - startRed) * franch + startRed); + int currentGreen = (int) ((endGreen - startGreen) * franch + startGreen); + int currentBlue = (int) ((endBlue - startBlue) * franch + startBlue); + + return "#" + getHexString(currentAlpha) + getHexString(currentRed) + + getHexString(currentGreen) + getHexString(currentBlue); + + } + + /** + * 将10进制颜色值转换成16进制。 + */ + public static String getHexString(int value) { + String hexString = Integer.toHexString(value); + if (hexString.length() == 1) { + hexString = "0" + hexString; + } + return hexString; + } + /** * 年月份选择视图是否打开 @@ -752,7 +833,7 @@ public final List getSelectCalendarRange() { * * @param calendarItemHeight MonthView item height */ - public final void setCalendarItemHeight(int calendarItemHeight) { + public final void setCalendarItemHeight(float calendarItemHeight) { if (mDelegate.getCalendarItemHeight() == calendarItemHeight) { return; } @@ -1966,4 +2047,12 @@ public interface OnVerticalItemInitializeListener { public void setOnVerticalItemInitialize(OnVerticalItemInitializeListener listener) { this.mDelegate.mVerticalItemInitializeListener = listener; } + + public interface OnStickyVerticalItemInitializeListener { + void onVerticalItemInitialize(RecyclerView.ViewHolder viewHolder, int position, int year, int month); + } + + public void setOnStickyVerticalItemInitialize(OnStickyVerticalItemInitializeListener listener) { + this.mDelegate.mStickyVerticalItemInitializeListener = listener; + } } diff --git a/calendarview/src/main/java/com/haibin/calendarview/CalendarViewDelegate.java b/calendarview/src/main/java/com/haibin/calendarview/CalendarViewDelegate.java index 7ab71a95..82d895d5 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/CalendarViewDelegate.java +++ b/calendarview/src/main/java/com/haibin/calendarview/CalendarViewDelegate.java @@ -154,34 +154,32 @@ public class CalendarViewDelegate { /** * 年视图一些padding */ - private int - mYearViewPadding, - mYearViewPaddingLeft, - mYearViewPaddingRight; + private float mYearViewPadding; + private float mYearViewPaddingLeft; + private float mYearViewPaddingRight; /** * 年视图一些padding */ - private int - mYearViewMonthPaddingLeft, - mYearViewMonthPaddingRight, - mYearViewMonthPaddingTop, - mYearViewMonthPaddingBottom; + private float mYearViewMonthPaddingLeft; + private float mYearViewMonthPaddingRight; + private float mYearViewMonthPaddingTop; + private float mYearViewMonthPaddingBottom; /** * 日历内部左右padding */ - private int mCalendarPadding; + private float mCalendarPadding; /** * 日历内部左padding */ - private int mCalendarPaddingLeft; + private float mCalendarPaddingLeft; /** * 日历内部右padding */ - private int mCalendarPaddingRight; + private float mCalendarPaddingRight; /** * 年视图字体大小 @@ -193,8 +191,8 @@ public class CalendarViewDelegate { /** * 年视图月份高度和周的高度 */ - private int mYearViewMonthHeight, - mYearViewWeekHeight; + private float mYearViewMonthHeight; + private float mYearViewWeekHeight; /** @@ -217,7 +215,7 @@ public class CalendarViewDelegate { /** * 星期栏Line margin */ - private int mWeekLineMargin; + private float mWeekLineMargin; /** * 星期栏字体大小 @@ -305,7 +303,7 @@ public class CalendarViewDelegate { /** * 日历卡的项高度 */ - private int mCalendarItemHeight; + private float mCalendarItemHeight; /** * 是否是全屏日历 @@ -315,7 +313,7 @@ public class CalendarViewDelegate { /** * 星期栏的高度 */ - private int mWeekBarHeight; + private float mWeekBarHeight; /** * 今天的日子 @@ -406,6 +404,8 @@ public class CalendarViewDelegate { CalendarView.OnVerticalItemInitializeListener mVerticalItemInitializeListener; + CalendarView.OnStickyVerticalItemInitializeListener mStickyVerticalItemInitializeListener; + /** * 保存选中的日期 */ @@ -443,7 +443,7 @@ public class CalendarViewDelegate { /** * 月份资源文本id */ - public int monthStringResId = R.array.week_string_array; + public int monthStringResId = R.array.month_string_array; /** * 预览的日期, 格式必须是yyyyMMdd. @@ -456,9 +456,9 @@ public class CalendarViewDelegate { LunarCalendar.init(context); - mCalendarPadding = (int) array.getDimension(R.styleable.CalendarView_calendar_padding, 0); - mCalendarPaddingLeft = (int) array.getDimension(R.styleable.CalendarView_calendar_padding_left, 0); - mCalendarPaddingRight = (int) array.getDimension(R.styleable.CalendarView_calendar_padding_right, 0); + mCalendarPadding = array.getDimension(R.styleable.CalendarView_calendar_padding, 0); + mCalendarPaddingLeft = array.getDimension(R.styleable.CalendarView_calendar_padding_left, 0); + mCalendarPaddingRight = array.getDimension(R.styleable.CalendarView_calendar_padding_right, 0); if (mCalendarPadding != 0) { mCalendarPaddingLeft = mCalendarPadding; @@ -474,14 +474,14 @@ public class CalendarViewDelegate { mWeekBarClassPath = array.getString(R.styleable.CalendarView_week_bar_view); mWeekTextSize = array.getDimensionPixelSize(R.styleable.CalendarView_week_text_size, CalendarUtil.dipToPx(context, 12)); - mWeekBarHeight = (int) array.getDimension(R.styleable.CalendarView_week_bar_height, + mWeekBarHeight = array.getDimension(R.styleable.CalendarView_week_bar_height, CalendarUtil.dipToPx(context, 40)); - mWeekLineMargin = (int) array.getDimension(R.styleable.CalendarView_week_line_margin, + mWeekLineMargin = array.getDimension(R.styleable.CalendarView_week_line_margin, CalendarUtil.dipToPx(context, 0)); mSchemeText = array.getString(R.styleable.CalendarView_scheme_text); if (TextUtils.isEmpty(mSchemeText)) { - mSchemeText = "记"; + mSchemeText = ""; } mMonthViewScrollable = array.getBoolean(R.styleable.CalendarView_month_view_scrollable, true); @@ -528,7 +528,7 @@ public class CalendarViewDelegate { CalendarUtil.dipToPx(context, 16)); mLunarTextSize = array.getDimensionPixelSize(R.styleable.CalendarView_lunar_text_size, CalendarUtil.dipToPx(context, 10)); - mCalendarItemHeight = (int) array.getDimension(R.styleable.CalendarView_calendar_height, + mCalendarItemHeight = array.getDimension(R.styleable.CalendarView_calendar_height, CalendarUtil.dipToPx(context, 56)); isFullScreenCalendar = array.getBoolean(R.styleable.CalendarView_calendar_match_parent, false); @@ -550,11 +550,11 @@ public class CalendarViewDelegate { mYearViewWeekHeight = array.getDimensionPixelSize(R.styleable.CalendarView_year_view_week_height, CalendarUtil.dipToPx(context, 0)); - mYearViewPadding = (int) array.getDimension(R.styleable.CalendarView_year_view_padding, + mYearViewPadding = array.getDimension(R.styleable.CalendarView_year_view_padding, CalendarUtil.dipToPx(context, 12)); - mYearViewPaddingLeft = (int) array.getDimension(R.styleable.CalendarView_year_view_padding_left, + mYearViewPaddingLeft = array.getDimension(R.styleable.CalendarView_year_view_padding_left, CalendarUtil.dipToPx(context, 12)); - mYearViewPaddingRight = (int) array.getDimension(R.styleable.CalendarView_year_view_padding_right, + mYearViewPaddingRight = array.getDimension(R.styleable.CalendarView_year_view_padding_right, CalendarUtil.dipToPx(context, 12)); showYearView = array.getBoolean(R.styleable.CalendarView_year_view_show, showYearView); @@ -567,14 +567,14 @@ public class CalendarViewDelegate { mYearViewPaddingRight = mYearViewPadding; } - mYearViewMonthPaddingTop = (int) array.getDimension(R.styleable.CalendarView_year_view_month_padding_top, + mYearViewMonthPaddingTop = array.getDimension(R.styleable.CalendarView_year_view_month_padding_top, CalendarUtil.dipToPx(context, 4)); - mYearViewMonthPaddingBottom = (int) array.getDimension(R.styleable.CalendarView_year_view_month_padding_bottom, + mYearViewMonthPaddingBottom = array.getDimension(R.styleable.CalendarView_year_view_month_padding_bottom, CalendarUtil.dipToPx(context, 4)); - mYearViewMonthPaddingLeft = (int) array.getDimension(R.styleable.CalendarView_year_view_month_padding_left, + mYearViewMonthPaddingLeft = array.getDimension(R.styleable.CalendarView_year_view_month_padding_left, CalendarUtil.dipToPx(context, 4)); - mYearViewMonthPaddingRight = (int) array.getDimension(R.styleable.CalendarView_year_view_month_padding_right, + mYearViewMonthPaddingRight = array.getDimension(R.styleable.CalendarView_year_view_month_padding_right, CalendarUtil.dipToPx(context, 4)); if (mMinYear <= MIN_YEAR) mMinYear = MIN_YEAR; @@ -732,7 +732,7 @@ int getWeekLineBackground() { return mWeekLineBackground; } - int getWeekLineMargin() { + float getWeekLineMargin() { return mWeekLineMargin; } @@ -756,7 +756,7 @@ String getYearViewClassPath() { return mYearViewClassPath; } - int getWeekBarHeight() { + float getWeekBarHeight() { return mWeekBarHeight; } @@ -776,11 +776,11 @@ int getLunarTextSize() { return mLunarTextSize; } - int getCalendarItemHeight() { + float getCalendarItemHeight() { return mCalendarItemHeight; } - void setCalendarItemHeight(int height) { + void setCalendarItemHeight(float height) { mCalendarItemHeight = height; } @@ -818,40 +818,40 @@ int getYearViewCurDayTextColor() { } @SuppressWarnings("unused") - int getYearViewPadding() { + float getYearViewPadding() { return mYearViewPadding; } - int getYearViewPaddingLeft() { + float getYearViewPaddingLeft() { return mYearViewPaddingLeft; } - int getYearViewPaddingRight() { + float getYearViewPaddingRight() { return mYearViewPaddingRight; } - int getYearViewMonthPaddingLeft() { + float getYearViewMonthPaddingLeft() { return mYearViewMonthPaddingLeft; } - int getYearViewMonthPaddingRight() { + float getYearViewMonthPaddingRight() { return mYearViewMonthPaddingRight; } - int getYearViewMonthPaddingTop() { + float getYearViewMonthPaddingTop() { return mYearViewMonthPaddingTop; } - int getYearViewMonthPaddingBottom() { + float getYearViewMonthPaddingBottom() { return mYearViewMonthPaddingBottom; } - int getYearViewWeekHeight() { + float getYearViewWeekHeight() { return mYearViewWeekHeight; } - int getYearViewMonthHeight() { + float getYearViewMonthHeight() { return mYearViewMonthHeight; } @@ -1015,7 +1015,7 @@ void updateCurrentDay() { } @SuppressWarnings("unused") - int getCalendarPadding() { + float getCalendarPadding() { return mCalendarPadding; } @@ -1025,7 +1025,7 @@ void setCalendarPadding(int mCalendarPadding) { mCalendarPaddingRight = mCalendarPadding; } - int getCalendarPaddingLeft() { + float getCalendarPaddingLeft() { return mCalendarPaddingLeft; } @@ -1033,7 +1033,7 @@ void setCalendarPaddingLeft(int mCalendarPaddingLeft) { this.mCalendarPaddingLeft = mCalendarPaddingLeft; } - int getCalendarPaddingRight() { + float getCalendarPaddingRight() { return mCalendarPaddingRight; } diff --git a/calendarview/src/main/java/com/haibin/calendarview/DefaultMonthView.java b/calendarview/src/main/java/com/haibin/calendarview/DefaultMonthView.java index ea9f3c83..5dd69b9f 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/DefaultMonthView.java +++ b/calendarview/src/main/java/com/haibin/calendarview/DefaultMonthView.java @@ -61,14 +61,14 @@ public DefaultMonthView(Context context) { * @return true 则绘制onDrawScheme,因为这里背景色不是是互斥的 */ @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme) { mSelectedPaint.setStyle(Paint.Style.FILL); canvas.drawRect(x + mPadding, y + mPadding, x + mItemWidth - mPadding, y + mItemHeight - mPadding, mSelectedPaint); return true; } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y) { mSchemeBasicPaint.setColor(calendar.getSchemeColor()); canvas.drawCircle(x + mItemWidth - mPadding - mRadio / 2, y + mPadding + mRadio, mRadio, mSchemeBasicPaint); @@ -90,9 +90,9 @@ protected float getTextWidth(String text) { @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { - int cx = x + mItemWidth / 2; - int top = y - mItemHeight / 6; + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { + float cx = x + mItemWidth / 2; + float top = y - mItemHeight / 6; if (isSelected) { canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, diff --git a/calendarview/src/main/java/com/haibin/calendarview/DefaultWeekView.java b/calendarview/src/main/java/com/haibin/calendarview/DefaultWeekView.java index da483908..4a9b903f 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/DefaultWeekView.java +++ b/calendarview/src/main/java/com/haibin/calendarview/DefaultWeekView.java @@ -61,7 +61,7 @@ public DefaultWeekView(Context context) { * @return true 则绘制onDrawScheme,因为这里背景色不是是互斥的 */ @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme) { mSelectedPaint.setStyle(Paint.Style.FILL); canvas.drawRect(x + mPadding, mPadding, x + mItemWidth - mPadding, mItemHeight - mPadding, mSelectedPaint); return true; @@ -69,7 +69,7 @@ protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolea @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x) { mSchemeBasicPaint.setColor(calendar.getSchemeColor()); canvas.drawCircle(x + mItemWidth - mPadding - mRadio / 2, mPadding + mRadio, mRadio, mSchemeBasicPaint); @@ -91,9 +91,9 @@ protected float getTextWidth(String text) { @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { - int cx = x + mItemWidth / 2; - int top = -mItemHeight / 6; + protected void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected) { + float cx = x + mItemWidth / 2; + float top = -mItemHeight / 6; if (isSelected) { canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, diff --git a/calendarview/src/main/java/com/haibin/calendarview/DefaultYearView.java b/calendarview/src/main/java/com/haibin/calendarview/DefaultYearView.java index d0eb9c3c..43ae0692 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/DefaultYearView.java +++ b/calendarview/src/main/java/com/haibin/calendarview/DefaultYearView.java @@ -34,7 +34,7 @@ public DefaultYearView(Context context) { @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawMonth(Canvas canvas, int year, int month, int x, int y, int width, int height) { + protected void onDrawMonth(Canvas canvas, int year, int month, float x, float y, float width, float height) { String text = getContext() .getResources() @@ -48,7 +48,7 @@ protected void onDrawMonth(Canvas canvas, int year, int month, int x, int y, int @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override - protected void onDrawWeek(Canvas canvas, int week, int x, int y, int width, int height) { + protected void onDrawWeek(Canvas canvas, int week, float x, float y, float width, float height) { String text = getContext().getResources().getStringArray(R.array.year_view_week_string_array)[week]; canvas.drawText(text, x + width / 2, @@ -58,19 +58,19 @@ protected void onDrawWeek(Canvas canvas, int week, int x, int y, int width, int @Override - protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme) { return false; } @Override - protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + protected void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y) { } @Override - protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + protected void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine + y; - int cx = x + mItemWidth / 2; + float cx = x + mItemWidth / 2; if (isSelected) { canvas.drawText(String.valueOf(calendar.getDay()), diff --git a/calendarview/src/main/java/com/haibin/calendarview/IDrawBaseView.java b/calendarview/src/main/java/com/haibin/calendarview/IDrawBaseView.java index 899bcf80..10666fbb 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/IDrawBaseView.java +++ b/calendarview/src/main/java/com/haibin/calendarview/IDrawBaseView.java @@ -12,17 +12,17 @@ public interface IDrawBaseView { /** - * @see MonthView#onDrawSelected(android.graphics.Canvas, com.haibin.calendarview.Calendar, int, int, boolean) + * @see MonthView#onDrawSelected(Canvas, Calendar, float, float, boolean) */ - boolean onDrawSelected(BaseView baseView, Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme); + boolean onDrawSelected(BaseView baseView, Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme); /** - * @see MonthView#onDrawScheme(android.graphics.Canvas, com.haibin.calendarview.Calendar, int, int) + * @see MonthView#onDrawScheme(Canvas, Calendar, float, float) */ - void onDrawScheme(BaseView baseView, Canvas canvas, Calendar calendar, int x, int y); + void onDrawScheme(BaseView baseView, Canvas canvas, Calendar calendar, float x, float y); /** - * @see MonthView#onDrawText(android.graphics.Canvas, com.haibin.calendarview.Calendar, int, int, boolean, boolean) + * @see MonthView#onDrawText(Canvas, Calendar, float, float, boolean, boolean) */ - void onDrawText(BaseView baseView, Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected); + void onDrawText(BaseView baseView, Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected); } diff --git a/calendarview/src/main/java/com/haibin/calendarview/MonthAnimHelper.java b/calendarview/src/main/java/com/haibin/calendarview/MonthAnimHelper.java index 639739e6..fca108c2 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/MonthAnimHelper.java +++ b/calendarview/src/main/java/com/haibin/calendarview/MonthAnimHelper.java @@ -15,10 +15,10 @@ */ public class MonthAnimHelper extends AnimatorListenerAdapter implements ValueAnimator.AnimatorUpdateListener { - int startX = 0; - int endX = 0; - int startY = 0; - int endY = 0; + float startX = 0; + float endX = 0; + float startY = 0; + float endY = 0; Calendar calendar; ValueAnimator animator; MonthView monthView; diff --git a/calendarview/src/main/java/com/haibin/calendarview/MonthView.java b/calendarview/src/main/java/com/haibin/calendarview/MonthView.java index a30b758c..f4473383 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/MonthView.java +++ b/calendarview/src/main/java/com/haibin/calendarview/MonthView.java @@ -33,9 +33,7 @@ public MonthView(Context context) { protected void onDraw(Canvas canvas) { if (mLineCount == 0) return; - mItemWidth = (getWidth() - - mDelegate.getCalendarPaddingLeft() - - mDelegate.getCalendarPaddingRight()) / 7; + mItemWidth = (getWidth() - mDelegate.getCalendarPaddingLeft() - mDelegate.getCalendarPaddingRight()) / 7; onPreviewHook(); onDrawCalendar(canvas); if (monthAnimHelper != null) { @@ -100,8 +98,8 @@ protected void onDrawCalendar(Canvas canvas) { * @param d d */ protected void draw(Canvas canvas, Calendar calendar, int i, int j, int d) { - int x = j * mItemWidth + mDelegate.getCalendarPaddingLeft(); - int y = i * mItemHeight; + float x = j * mItemWidth + mDelegate.getCalendarPaddingLeft(); + float y = i * mItemHeight; boolean isSelected = d == mCurrentItem; if (monthAnimHelper != null && monthAnimHelper.isStarted()) { if (monthAnimHelper.calendar == mItems.get(mCurrentItem)) { @@ -115,7 +113,7 @@ protected void draw(Canvas canvas, Calendar calendar, int i, int j, int d) { /** * 在指定的x,y绘制日历 */ - protected void drawCalendar(Canvas canvas, Calendar calendar, int x, int y, boolean isSelected) { + protected void drawCalendar(Canvas canvas, Calendar calendar, float x, float y, boolean isSelected) { onLoopStart(x, y); boolean hasScheme = calendar.hasScheme(); @@ -298,7 +296,7 @@ protected void onChangeItemTo(int from, int to) { * @param hasScheme hasScheme 非标记的日期 * @return 是否绘制onDrawScheme,true or false */ - protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme); + protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme); /** * 绘制标记的日期,这里可以是背景色,标记色什么的 @@ -308,7 +306,7 @@ protected void onChangeItemTo(int from, int to) { * @param x 日历Card x起点坐标 * @param y 日历Card y起点坐标 */ - protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y); + protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y); /** @@ -321,5 +319,5 @@ protected void onChangeItemTo(int from, int to) { * @param hasScheme 是否是标记的日期 * @param isSelected 是否选中 */ - protected abstract void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected); + protected abstract void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected); } diff --git a/calendarview/src/main/java/com/haibin/calendarview/MonthViewPager.java b/calendarview/src/main/java/com/haibin/calendarview/MonthViewPager.java index aab71592..cfc8464b 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/MonthViewPager.java +++ b/calendarview/src/main/java/com/haibin/calendarview/MonthViewPager.java @@ -42,7 +42,9 @@ public final class MonthViewPager extends ViewPager { private CalendarViewDelegate mDelegate; - private int mNextViewHeight, mPreViewHeight, mCurrentViewHeight; + private float mNextViewHeight; + private float mPreViewHeight; + private float mCurrentViewHeight; CalendarLayout mParentLayout; @@ -85,7 +87,7 @@ void setup(CalendarViewDelegate delegate) { ViewGroup.LayoutParams params = getLayoutParams(); if (params != null) { - params.height = mCurrentViewHeight; + params.height = (int) mCurrentViewHeight; setLayoutParams(params); } init(); @@ -212,7 +214,7 @@ private void updateMonthViewHeight(int year, int month) { mCurrentViewHeight = 6 * mDelegate.getCalendarItemHeight(); ViewGroup.LayoutParams params = getLayoutParams(); if (params != null) { - params.height = mCurrentViewHeight; + params.height = (int) mCurrentViewHeight; } return; } @@ -220,7 +222,7 @@ private void updateMonthViewHeight(int year, int month) { if (mParentLayout != null) { if (getVisibility() != VISIBLE) {//如果已经显示周视图,则需要动态改变月视图高度,否则显示就有bug ViewGroup.LayoutParams params = getLayoutParams(); - params.height = CalendarUtil.getMonthViewHeight(year, month, + params.height = (int) CalendarUtil.getMonthViewHeight(year, month, mDelegate.getCalendarItemHeight(), mDelegate.getWeekStart(), mDelegate); setLayoutParams(params); @@ -513,7 +515,7 @@ void updateShowMode() { updateMonthViewHeight(mDelegate.mSelectedCalendar.getYear(), mDelegate.mSelectedCalendar.getMonth()); } ViewGroup.LayoutParams params = getLayoutParams(); - params.height = mCurrentViewHeight; + params.height = (int) mCurrentViewHeight; setLayoutParams(params); if (mParentLayout != null) { mParentLayout.updateContentViewTranslateY(); @@ -535,7 +537,7 @@ void updateWeekStart() { updateMonthViewHeight(mDelegate.mSelectedCalendar.getYear(), mDelegate.mSelectedCalendar.getMonth()); ViewGroup.LayoutParams params = getLayoutParams(); - params.height = mCurrentViewHeight; + params.height = (int) mCurrentViewHeight; setLayoutParams(params); if (mParentLayout != null) { int i = CalendarUtil.getWeekFromDayInMonth(mDelegate.mSelectedCalendar, mDelegate.getWeekStart()); @@ -584,7 +586,7 @@ final void updateItemHeight() { } } ViewGroup.LayoutParams params = getLayoutParams(); - params.height = mCurrentViewHeight; + params.height = (int) mCurrentViewHeight; setLayoutParams(params); } diff --git a/calendarview/src/main/java/com/haibin/calendarview/MultiMonthView.java b/calendarview/src/main/java/com/haibin/calendarview/MultiMonthView.java index 3973694c..f54aea34 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/MultiMonthView.java +++ b/calendarview/src/main/java/com/haibin/calendarview/MultiMonthView.java @@ -72,8 +72,8 @@ protected void onDraw(Canvas canvas) { * @param j j */ private void draw(Canvas canvas, Calendar calendar, int calendarIndex, int i, int j) { - int x = j * mItemWidth + mDelegate.getCalendarPaddingLeft(); - int y = i * mItemHeight; + float x = j * mItemWidth + mDelegate.getCalendarPaddingLeft(); + float y = i * mItemHeight; onLoopStart(x, y); boolean isSelected = isCalendarSelected(calendar); boolean hasScheme = calendar.hasScheme(); @@ -234,7 +234,7 @@ protected final boolean isSelectNextCalendar(Calendar calendar, int calendarInde * @param isSelectedNext 下一个日期是否选中 * @return 是否继续绘制onDrawScheme,true or false */ - protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, + protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelectedPre, boolean isSelectedNext); /** @@ -246,7 +246,7 @@ protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int * @param y 日历Card y起点坐标 * @param isSelected 是否选中 */ - protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y, boolean isSelected); + protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y, boolean isSelected); /** @@ -259,5 +259,5 @@ protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int * @param hasScheme 是否是标记的日期 * @param isSelected 是否选中 */ - protected abstract void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected); + protected abstract void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected); } diff --git a/calendarview/src/main/java/com/haibin/calendarview/MultiWeekView.java b/calendarview/src/main/java/com/haibin/calendarview/MultiWeekView.java index db731c0a..d2274e3e 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/MultiWeekView.java +++ b/calendarview/src/main/java/com/haibin/calendarview/MultiWeekView.java @@ -44,7 +44,7 @@ protected void onDraw(Canvas canvas) { onPreviewHook(); for (int i = 0; i < 7; i++) { - int x = i * mItemWidth + mDelegate.getCalendarPaddingLeft(); + float x = i * mItemWidth + mDelegate.getCalendarPaddingLeft(); onLoopStart(x); Calendar calendar = mItems.get(i); boolean isSelected = isCalendarSelected(calendar); @@ -189,7 +189,7 @@ protected final boolean isSelectNextCalendar(Calendar calendar, int calendarInde * @param isSelectedNext 下一个日期是否选中 * @return 是否绘制 onDrawScheme */ - protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme, + protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelectedPre, boolean isSelectedNext); /** @@ -200,7 +200,7 @@ protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int * @param x 日历Card x起点坐标 * @param isSelected 是否选中 */ - protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, int x, boolean isSelected); + protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, float x, boolean isSelected); /** @@ -212,5 +212,5 @@ protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int * @param hasScheme 是否是标记的日期 * @param isSelected 是否选中 */ - protected abstract void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected); + protected abstract void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected); } diff --git a/calendarview/src/main/java/com/haibin/calendarview/RangeMonthView.java b/calendarview/src/main/java/com/haibin/calendarview/RangeMonthView.java index 0effb05b..2d154b4e 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/RangeMonthView.java +++ b/calendarview/src/main/java/com/haibin/calendarview/RangeMonthView.java @@ -71,8 +71,8 @@ protected void onDraw(Canvas canvas) { * @param j j */ protected void draw(Canvas canvas, Calendar calendar, int calendarIndex, int i, int j) { - int x = j * mItemWidth + mDelegate.getCalendarPaddingLeft(); - int y = i * mItemHeight; + float x = j * mItemWidth + mDelegate.getCalendarPaddingLeft(); + float y = i * mItemHeight; onLoopStart(x, y); boolean isSelected = isCalendarSelected(calendar); boolean hasScheme = calendar.hasScheme(); @@ -267,7 +267,7 @@ protected boolean isSelectNextCalendar(Calendar calendar, int calendarIndex) { * @param isSelectedNext 下一个日期是否选中 * @return 是否继续绘制onDrawScheme,true or false */ - protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, + protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelectedPre, boolean isSelectedNext); /** @@ -279,7 +279,7 @@ protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int * @param y 日历Card y起点坐标 * @param isSelected 是否选中 */ - protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y, boolean isSelected); + protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y, boolean isSelected); /** @@ -292,5 +292,5 @@ protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int * @param hasScheme 是否是标记的日期 * @param isSelected 是否选中 */ - protected abstract void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected); + protected abstract void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected); } diff --git a/calendarview/src/main/java/com/haibin/calendarview/RangeWeekView.java b/calendarview/src/main/java/com/haibin/calendarview/RangeWeekView.java index 435c9245..4a6b936c 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/RangeWeekView.java +++ b/calendarview/src/main/java/com/haibin/calendarview/RangeWeekView.java @@ -44,7 +44,7 @@ protected void onDraw(Canvas canvas) { onPreviewHook(); for (int i = 0; i < 7; i++) { - int x = i * mItemWidth + mDelegate.getCalendarPaddingLeft(); + float x = i * mItemWidth + mDelegate.getCalendarPaddingLeft(); onLoopStart(x); Calendar calendar = mItems.get(i); boolean isSelected = isCalendarSelected(calendar); @@ -221,7 +221,7 @@ protected final boolean isSelectNextCalendar(Calendar calendar, int calendarInde * @param isSelectedNext 下一个日期是否选中 * @return 是否绘制 onDrawScheme */ - protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme, + protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelectedPre, boolean isSelectedNext); /** @@ -232,7 +232,7 @@ protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int * @param x 日历Card x起点坐标 * @param isSelected 是否选中 */ - protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, int x, boolean isSelected); + protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, float x, boolean isSelected); /** @@ -244,5 +244,5 @@ protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int * @param hasScheme 是否是标记的日期 * @param isSelected 是否选中 */ - protected abstract void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected); + protected abstract void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected); } diff --git a/calendarview/src/main/java/com/haibin/calendarview/StickyVerticalCalendarView.java b/calendarview/src/main/java/com/haibin/calendarview/StickyVerticalCalendarView.java new file mode 100644 index 00000000..c0ab3d67 --- /dev/null +++ b/calendarview/src/main/java/com/haibin/calendarview/StickyVerticalCalendarView.java @@ -0,0 +1,278 @@ +package com.haibin.calendarview; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.animation.LinearInterpolator; +import android.widget.RelativeLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.viewpager.widget.ViewPager; + +import java.lang.reflect.Constructor; +import java.util.Map; + +/** + * 年月title吸顶的垂直日历 + * + * @author michaellee + * 2022/05/11 + */ +public class StickyVerticalCalendarView extends CalendarView { + + public StickyVerticalMonthRecyclerView monthRecyclerView; + + public StickyVerticalCalendarView(@NonNull Context context) { + super(context); + } + + public StickyVerticalCalendarView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void init(Context context, @Nullable AttributeSet attrs) { + calendarLayoutId = R.layout.cv_layout_vertical_calendar_sticky_view; + //填充布局 + LayoutInflater.from(context).inflate(calendarLayoutId, this, true); + + //周视图 + RelativeLayout rlContent = findViewById(R.id.rlContent); + this.mWeekPager = findViewById(R.id.vp_week); + this.mWeekPager.setup(mDelegate); + try { + Constructor constructor = mDelegate.getWeekBarClass().getConstructor(Context.class); + mWeekBar = (WeekBar) constructor.newInstance(getContext()); + } catch (Exception e) { + e.printStackTrace(); + } + + rlContent.addView(mWeekBar, new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); + mWeekBar.setup(mDelegate); + mWeekBar.onWeekStartChange(mDelegate.getWeekStart()); + + CalendarView.OnClassInitializeListener listener = mDelegate.mClassInitializeListener; + if (listener != null) { + listener.onClassInitialize(mDelegate.getWeekBarClass(), mWeekBar); + } + + //横线 + this.mWeekLine = findViewById(R.id.line); + this.mWeekLine.setBackgroundColor(mDelegate.getWeekLineBackground()); + RelativeLayout.LayoutParams lineParams = (RelativeLayout.LayoutParams) this.mWeekLine.getLayoutParams(); + lineParams.setMargins((int) mDelegate.getWeekLineMargin(), + (int) mDelegate.getWeekBarHeight(), + (int) mDelegate.getWeekLineMargin(), + 0); + this.mWeekLine.setLayoutParams(lineParams); + + //月视图 + mMonthPager = new MonthViewPager(context); //提供一个占位用的视图, 防止库NPE异常 + this.monthRecyclerView = findViewById(R.id.rv_month); + + //年视图 + mYearViewPager = findViewById(R.id.selectLayout); + mYearViewPager.setPadding((int) mDelegate.getYearViewPaddingLeft(), 0, (int) mDelegate.getYearViewPaddingRight(), 0); + mYearViewPager.setBackgroundColor(mDelegate.getYearViewBackground()); + mYearViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + if (mWeekPager.getVisibility() == VISIBLE) { + return; + } + if (mDelegate.mYearChangeListener != null) { + mDelegate.mYearChangeListener.onYearChange(position + mDelegate.getMinYear()); + } + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + + mDelegate.mInnerListener = new OnInnerDateSelectedListener() { + /** + * 月视图选择事件 + * @param calendar calendar + * @param isClick 是否是点击 + */ + @Override + public void onMonthDateSelected(Calendar calendar, boolean isClick) { + mDelegate.mIndexCalendar = calendar; + if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT || isClick) { + mDelegate.mSelectedCalendar = calendar; + } + mWeekPager.updateSelected(mDelegate.mIndexCalendar, false); + monthRecyclerView.updateSelected(); + if (mWeekBar != null && + (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT || isClick)) { + mWeekBar.onDateSelected(calendar, mDelegate.getWeekStart(), isClick); + } + } + + /** + * 周视图选择事件 + * @param calendar calendar + * @param isClick 是否是点击 + */ + @Override + public void onWeekDateSelected(Calendar calendar, boolean isClick) { + mDelegate.mIndexCalendar = calendar; + if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT || isClick + || mDelegate.mIndexCalendar.equals(mDelegate.mSelectedCalendar)) { + mDelegate.mSelectedCalendar = calendar; + } + int y = calendar.getYear() - mDelegate.getMinYear(); + int position = 12 * y + mDelegate.mIndexCalendar.getMonth() - mDelegate.getMinYearMonth(); + mWeekPager.updateSingleSelect(); + monthRecyclerView.updateSelected(); + if (mWeekBar != null && + (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT + || isClick + || mDelegate.mIndexCalendar.equals(mDelegate.mSelectedCalendar))) { + mWeekBar.onDateSelected(calendar, mDelegate.getWeekStart(), isClick); + } + } + }; + + if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT) { + if (isInRange(mDelegate.getCurrentDay())) { + mDelegate.mSelectedCalendar = mDelegate.createCurrentDate(); + } else { + mDelegate.mSelectedCalendar = mDelegate.getMinRangeCalendar(); + } + } else { + mDelegate.mSelectedCalendar = new Calendar(); + } + + mDelegate.mIndexCalendar = mDelegate.mSelectedCalendar; + + mWeekBar.onDateSelected(mDelegate.mSelectedCalendar, mDelegate.getWeekStart(), false); + + monthRecyclerView.setup(mDelegate); + monthRecyclerView.setCurrentItem(mDelegate.mCurrentMonthViewItem, false); + mYearViewPager.setOnMonthSelectedListener(new YearRecyclerView.OnMonthSelectedListener() { + @Override + public void onMonthSelected(int year, int month) { + int position = 12 * (year - mDelegate.getMinYear()) + month - mDelegate.getMinYearMonth(); + closeSelectLayout(position); + mDelegate.isShowYearSelectedLayout = false; + } + }); + mYearViewPager.setup(mDelegate); + mWeekPager.updateSelected(mDelegate.createCurrentDate(), false); + + } + + @Override + public void setSchemeDate(Map mSchemeDates) { + super.setSchemeDate(mSchemeDates); + monthRecyclerView.update(); + } + + @Override + public void clearSchemeDate() { + super.clearSchemeDate(); + monthRecyclerView.update(); + } + + @Override + public void setRange(int minYear, int minYearMonth, int minYearDay, int maxYear, int maxYearMonth, int maxYearDay) { + super.setRange(minYear, minYearMonth, minYearDay, maxYear, maxYearMonth, maxYearDay); + monthRecyclerView.updateRange(); + } + + @Override + protected void showSelectLayout(int year) { + super.showSelectLayout(year); + + monthRecyclerView.animate() + .scaleX(0) + .scaleY(0) + .setDuration(260) + .setInterpolator(new LinearInterpolator()) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + if (mDelegate.mYearViewChangeListener != null) { + mDelegate.mYearViewChangeListener.onYearViewChange(false); + } + } + }); + } + + @Override + protected void closeSelectLayout(int position) { + super.closeSelectLayout(position); + + monthRecyclerView.setCurrentItem(position, false); + + monthRecyclerView.animate() + .scaleX(1) + .scaleY(1) + .setDuration(180) + .setInterpolator(new LinearInterpolator()) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + if (mDelegate.mYearViewChangeListener != null) { + mDelegate.mYearViewChangeListener.onYearViewChange(true); + } + if (mParentLayout != null) { + mParentLayout.showContentView(); + if (mParentLayout.isExpand()) { + mMonthPager.setVisibility(VISIBLE); + } else { + mWeekPager.setVisibility(VISIBLE); + mParentLayout.shrink(); + } + } else { + mMonthPager.setVisibility(VISIBLE); + } + mMonthPager.clearAnimation(); + } + }); + } + + @Override + public void scrollToCurrent(boolean smoothScroll) { + super.scrollToCurrent(smoothScroll); + monthRecyclerView.scrollToCurrent(smoothScroll); + } + + @Override + public void scrollToNext(boolean smoothScroll) { + super.scrollToNext(smoothScroll); + monthRecyclerView.scrollToNext(smoothScroll); + } + + @Override + public void scrollToPre(boolean smoothScroll) { + super.scrollToPre(smoothScroll); + monthRecyclerView.scrollToPre(smoothScroll); + } + + @Override + public void scrollToCalendar(int year, int month, int day, boolean smoothScroll, boolean invokeListener) { + super.scrollToCalendar(year, month, day, smoothScroll, invokeListener); + monthRecyclerView.scrollToCalendar(year, month, day, smoothScroll, invokeListener); + } + + @Override + public void setMonthView(Class cls) { + super.setMonthView(cls); + monthRecyclerView.updateMonthViewClass(); + } +} + diff --git a/calendarview/src/main/java/com/haibin/calendarview/StickyVerticalMonthRecyclerView.java b/calendarview/src/main/java/com/haibin/calendarview/StickyVerticalMonthRecyclerView.java new file mode 100644 index 00000000..47748093 --- /dev/null +++ b/calendarview/src/main/java/com/haibin/calendarview/StickyVerticalMonthRecyclerView.java @@ -0,0 +1,309 @@ +package com.haibin.calendarview; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.donkingliang.groupedadapter.adapter.GroupedRecyclerViewAdapter; +import com.donkingliang.groupedadapter.holder.BaseViewHolder; + +import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.List; + +/** + * 年月title吸顶的垂直日历 + * + * @author michaellee + * 2022/05/11 + */ +public class StickyVerticalMonthRecyclerView extends RecyclerView { + + protected CalendarViewDelegate mDelegate; + protected int mMonthCount; + protected CalendarLayout mParentLayout; + + public StickyVerticalMonthRecyclerView(@NonNull Context context) { + super(context); + init(context); + } + + public StickyVerticalMonthRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(context); + } + + public StickyVerticalMonthRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context); + } + + protected void init(@NonNull Context context) { + setLayoutManager(new LinearLayoutManager(context)); + + if (isInEditMode()) { + setup(new CalendarViewDelegate(context, null)); + } + } + + GroupVerticalMonthAdapter adapter; + + /** + * 初始化 + * + * @param delegate delegate + */ + void setup(CalendarViewDelegate delegate) { + this.mDelegate = delegate; + + mMonthCount = 12 * (mDelegate.getMaxYear() - mDelegate.getMinYear()) + - mDelegate.getMinYearMonth() + 1 + + mDelegate.getMaxYearMonth(); + if (adapter == null) { + adapter = new GroupVerticalMonthAdapter(getContext()); + } + setAdapter(adapter); + } + + void updateRange() { + if (getVisibility() != VISIBLE) { + return; + } + if (mDelegate != null) { + setup(mDelegate); + } + updateSelected(); + } + + void update() { + if (adapter != null) { + adapter.notifyItemRangeChanged(0, adapter.getGroupCount()); + } + } + + class MonthHolder { + BaseViewHolder viewHolder; + BaseMonthView monthView; + + public MonthHolder(BaseViewHolder holder) { + viewHolder = holder; + if (holder.itemView.getTag(R.id.tag_group_month_view) != null) { + monthView = (BaseMonthView) holder.itemView.getTag(R.id.tag_group_month_view); + } + } + } + + /** + * 更新选中的日期效果 + */ + void updateSelected() { + for (MonthHolder viewHolder : allViewHolder()) { + viewHolder.monthView.setSelectedCalendar(mDelegate.mSelectedCalendar); + viewHolder.monthView.invalidate(); + } + } + + /** + * 获取界面上的ViewHolder + */ + MonthHolder getViewHolder(int childIndex) { + if (childIndex >= 0 && childIndex < adapter.getGroupCount()) { + View child = getChildAt(childIndex * 2 + 1); + ViewHolder viewHolder = getChildViewHolder(child); + return new MonthHolder((BaseViewHolder) viewHolder); + } + return null; + } + + /** + * 界面上所有的ViewHolder + */ + List allViewHolder() { + ArrayList result = new ArrayList<>(); + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + ViewHolder holder = getChildViewHolder(child); + MonthHolder monthHolder = new MonthHolder((BaseViewHolder) holder); + if (monthHolder.monthView != null) { + result.add(monthHolder); + } + } + return result; + } + + public void setCurrentItem(int position) { + setCurrentItem(position, true); + } + + public void setCurrentItem(int pos, final boolean smoothScroll) { + final int position = pos * 2; + LayoutManager layoutManager = getLayoutManager(); + if (layoutManager == null) { + return; + } + if (smoothScroll) { + ViewHolder holder = findViewHolderForAdapterPosition(position); + if (holder == null) { + smoothScrollToPosition(position); + } else { + int dy = layoutManager.getDecoratedTop(holder.itemView) - getPaddingTop(); + smoothScrollBy(0, dy); + } + } else { + if (layoutManager instanceof LinearLayoutManager) { + ((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(position, 0); + } else { + scrollToPosition(position); + } + } + updateSelected(); + } + + public void scrollToNext(boolean smoothScroll) { + LinearLayoutManager linearLayoutManager = (LinearLayoutManager) getLayoutManager(); + int first = linearLayoutManager.findFirstVisibleItemPosition(); + int groupPosition = adapter.getGroupPositionForPosition(first); + setCurrentItem(groupPosition + 1, smoothScroll); + } + + public void scrollToPre(boolean smoothScroll) { + LinearLayoutManager linearLayoutManager = (LinearLayoutManager) getLayoutManager(); + int first = linearLayoutManager.findFirstVisibleItemPosition(); + int groupPosition = adapter.getGroupPositionForPosition(first); + setCurrentItem(groupPosition - ((first & 1) == 1 ? 0 : 1), smoothScroll); + } + + public void scrollToCurrent(boolean smoothScroll) { + int position = 12 * (mDelegate.getCurrentDay().getYear() - mDelegate.getMinYear()) + + mDelegate.getCurrentDay().getMonth() - mDelegate.getMinYearMonth(); + setCurrentItem(position, smoothScroll); + } + + public void scrollToCalendar(int year, int month, int day, boolean smoothScroll, boolean invokeListener) { + Calendar calendar = new Calendar(); + calendar.setYear(year); + calendar.setMonth(month); + calendar.setDay(day); + calendar.setCurrentDay(calendar.equals(mDelegate.getCurrentDay())); + LunarCalendar.setupLunarCalendar(calendar); + mDelegate.mIndexCalendar = calendar; + mDelegate.mSelectedCalendar = calendar; + mDelegate.updateSelectCalendarScheme(); + int y = calendar.getYear() - mDelegate.getMinYear(); + int position = 12 * y + calendar.getMonth() - mDelegate.getMinYearMonth(); + setCurrentItem(position, smoothScroll); + } + + /** + * 更新月视图Class + */ + void updateMonthViewClass() { + setup(mDelegate); + setCurrentItem(mDelegate.mCurrentMonthViewItem, false); + } + + protected class GroupVerticalMonthAdapter extends GroupedRecyclerViewAdapter { + + public GroupVerticalMonthAdapter(Context context) { + super(context); + } + + @Override + public int getGroupCount() { + return mMonthCount; + } + + @Override + public int getChildrenCount(int groupPosition) { + return 1; + } + + @Override + public boolean hasHeader(int groupPosition) { + return true; + } + + @Override + public boolean hasFooter(int groupPosition) { + return false; + } + + @Override + public int getHeaderLayout(int viewType) { + return R.layout.cv_layout_vertical_month_sticky_title; + } + + @Override + public int getFooterLayout(int viewType) { + return 0; + } + + @Override + public int getChildLayout(int viewType) { + return R.layout.cv_layout_vertical_month_sticky_view; + } + + @Override + public void onBindHeaderViewHolder(BaseViewHolder holder, int groupPosition) { + + int year = (groupPosition + mDelegate.getMinYearMonth() - 1) / 12 + mDelegate.getMinYear(); + int month = (groupPosition + mDelegate.getMinYearMonth() - 1) % 12 + 1; + + TextView currentMonthView = holder.itemView.findViewById(R.id.current_month_view); + if (currentMonthView != null) { + currentMonthView.setText(year + "年" + month + "月"); + } + } + + @Override + public void onBindFooterViewHolder(BaseViewHolder holder, int groupPosition) { + + } + + @Override + public void onBindChildViewHolder(BaseViewHolder holder, int groupPosition, int childPosition) { + + int year = (groupPosition + mDelegate.getMinYearMonth() - 1) / 12 + mDelegate.getMinYear(); + int month = (groupPosition + mDelegate.getMinYearMonth() - 1) % 12 + 1; + BaseMonthView monthView; + if (holder.itemView.getTag(R.id.tag_group_month_view) == null) { + try { + Constructor constructor = mDelegate.getMonthViewClass().getConstructor(Context.class); + monthView = (BaseMonthView) constructor.newInstance(getContext()); + + ViewGroup monthContainer = holder.itemView.findViewById(R.id.month_container); + monthContainer.addView(monthView); + } catch (Exception e) { + e.printStackTrace(); + monthView = new DefaultMonthView(getContext()); + } + + CalendarView.OnClassInitializeListener listener = mDelegate.mClassInitializeListener; + if (listener != null) { + listener.onClassInitialize(mDelegate.getMonthViewClass(), monthView); + } + holder.itemView.setTag(R.id.tag_group_month_view, monthView); + } else { + monthView = (BaseMonthView) holder.itemView.getTag(R.id.tag_group_month_view); + } + monthView.mParentLayout = mParentLayout; + monthView.setup(mDelegate); + monthView.setTag(groupPosition); + monthView.initMonthWithDate(year, month); + monthView.setSelectedCalendar(mDelegate.mSelectedCalendar); + + CalendarView.OnStickyVerticalItemInitializeListener stickyVerticalItemInitializeListener = mDelegate.mStickyVerticalItemInitializeListener; + if (stickyVerticalItemInitializeListener != null) { + stickyVerticalItemInitializeListener.onVerticalItemInitialize(holder, groupPosition, year, month); + } + } + } + +} diff --git a/calendarview/src/main/java/com/haibin/calendarview/VerticalCalendarView.java b/calendarview/src/main/java/com/haibin/calendarview/VerticalCalendarView.java index 29a36fa1..7259de52 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/VerticalCalendarView.java +++ b/calendarview/src/main/java/com/haibin/calendarview/VerticalCalendarView.java @@ -73,9 +73,9 @@ protected void init(Context context, @Nullable AttributeSet attrs) { this.mWeekLine = findViewById(R.id.line); this.mWeekLine.setBackgroundColor(mDelegate.getWeekLineBackground()); LayoutParams lineParams = (LayoutParams) this.mWeekLine.getLayoutParams(); - lineParams.setMargins(mDelegate.getWeekLineMargin(), - mDelegate.getWeekBarHeight(), - mDelegate.getWeekLineMargin(), + lineParams.setMargins((int) mDelegate.getWeekLineMargin(), + (int) mDelegate.getWeekBarHeight(), + (int) mDelegate.getWeekLineMargin(), 0); this.mWeekLine.setLayoutParams(lineParams); @@ -87,12 +87,12 @@ protected void init(Context context, @Nullable AttributeSet attrs) { //this.mMonthPager.mWeekBar = mWeekBar; //mMonthPager.setup(mDelegate); LayoutParams params = (LayoutParams) this.monthRecyclerView.getLayoutParams(); - params.setMargins(0, mDelegate.getWeekBarHeight() + CalendarUtil.dipToPx(context, 1), 0, 0); + params.setMargins(0, (int) mDelegate.getWeekBarHeight() + CalendarUtil.dipToPx(context, 1), 0, 0); mWeekPager.setLayoutParams(params); //年视图 mYearViewPager = findViewById(R.id.selectLayout); - mYearViewPager.setPadding(mDelegate.getYearViewPaddingLeft(), 0, mDelegate.getYearViewPaddingRight(), 0); + mYearViewPager.setPadding((int) mDelegate.getYearViewPaddingLeft(), 0, (int) mDelegate.getYearViewPaddingRight(), 0); mYearViewPager.setBackgroundColor(mDelegate.getYearViewBackground()); mYearViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override diff --git a/calendarview/src/main/java/com/haibin/calendarview/WeekAnimHelper.java b/calendarview/src/main/java/com/haibin/calendarview/WeekAnimHelper.java index 27494fb7..15d3731e 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/WeekAnimHelper.java +++ b/calendarview/src/main/java/com/haibin/calendarview/WeekAnimHelper.java @@ -15,10 +15,10 @@ */ public class WeekAnimHelper extends AnimatorListenerAdapter implements ValueAnimator.AnimatorUpdateListener { - int startX = 0; - int endX = 0; - int startY = 0; - int endY = 0; + float startX = 0; + float endX = 0; + float startY = 0; + float endY = 0; Calendar calendar; ValueAnimator animator; WeekView weekView; diff --git a/calendarview/src/main/java/com/haibin/calendarview/WeekBar.java b/calendarview/src/main/java/com/haibin/calendarview/WeekBar.java index 5d2a3b21..a0b32ef7 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/WeekBar.java +++ b/calendarview/src/main/java/com/haibin/calendarview/WeekBar.java @@ -47,7 +47,7 @@ protected void setup(CalendarViewDelegate delegate) { setTextSize(mDelegate.getWeekTextSize()); setTextColor(delegate.getWeekTextColor()); setBackgroundColor(delegate.getWeekBackground()); - setPadding(delegate.getCalendarPaddingLeft(), 0, delegate.getCalendarPaddingRight(), 0); + setPadding((int) delegate.getCalendarPaddingLeft(), 0, (int) delegate.getCalendarPaddingRight(), 0); } } @@ -141,7 +141,7 @@ private String getWeekString(int index, int weekStart) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (mDelegate != null) { - heightMeasureSpec = MeasureSpec.makeMeasureSpec(mDelegate.getWeekBarHeight(), MeasureSpec.EXACTLY); + heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) mDelegate.getWeekBarHeight(), MeasureSpec.EXACTLY); } else { heightMeasureSpec = MeasureSpec.makeMeasureSpec(CalendarUtil.dipToPx(getContext(), 40), MeasureSpec.EXACTLY); } diff --git a/calendarview/src/main/java/com/haibin/calendarview/WeekView.java b/calendarview/src/main/java/com/haibin/calendarview/WeekView.java index ba034994..b38d8a2e 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/WeekView.java +++ b/calendarview/src/main/java/com/haibin/calendarview/WeekView.java @@ -44,7 +44,7 @@ protected void onDraw(Canvas canvas) { onPreviewHook(); for (int i = 0; i < mItems.size(); i++) { - int x = i * mItemWidth + mDelegate.getCalendarPaddingLeft(); + float x = i * mItemWidth + mDelegate.getCalendarPaddingLeft(); boolean isSelected = i == mCurrentItem; if (weekAnimHelper != null && weekAnimHelper.isStarted()) { if (weekAnimHelper.calendar == mItems.get(mCurrentItem)) { @@ -62,7 +62,7 @@ protected void onDraw(Canvas canvas) { } } - protected void drawCalendar(Canvas canvas, Calendar calendar, int x, boolean isSelected) { + protected void drawCalendar(Canvas canvas, Calendar calendar, float x, boolean isSelected) { onLoopStart(x); boolean hasScheme = calendar.hasScheme(); if (hasScheme) { @@ -209,7 +209,7 @@ protected void onChangeItemTo(int from, int to) { * @param hasScheme hasScheme 非标记的日期 * @return 是否绘制 onDrawScheme */ - protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme); + protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, boolean hasScheme); /** * 绘制标记的日期 @@ -218,7 +218,7 @@ protected void onChangeItemTo(int from, int to) { * @param calendar 日历calendar * @param x 日历Card x起点坐标 */ - protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, int x); + protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, float x); /** @@ -230,5 +230,5 @@ protected void onChangeItemTo(int from, int to) { * @param hasScheme 是否是标记的日期 * @param isSelected 是否选中 */ - protected abstract void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected); + protected abstract void onDrawText(Canvas canvas, Calendar calendar, float x, boolean hasScheme, boolean isSelected); } diff --git a/calendarview/src/main/java/com/haibin/calendarview/WeekViewPager.java b/calendarview/src/main/java/com/haibin/calendarview/WeekViewPager.java index 74ccc984..03e35abd 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/WeekViewPager.java +++ b/calendarview/src/main/java/com/haibin/calendarview/WeekViewPager.java @@ -177,9 +177,9 @@ void updateRange() { /** * 滚动到指定日期 * - * @param year 年 - * @param month 月 - * @param day 日 + * @param year 年 + * @param month 月 + * @param day 日 * @param invokeListener 调用日期事件 */ void scrollToCalendar(int year, int month, int day, boolean smoothScroll, boolean invokeListener) { @@ -425,7 +425,7 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - heightMeasureSpec = MeasureSpec.makeMeasureSpec(mDelegate.getCalendarItemHeight(), MeasureSpec.EXACTLY); + heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) mDelegate.getCalendarItemHeight(), MeasureSpec.EXACTLY); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } diff --git a/calendarview/src/main/java/com/haibin/calendarview/YearView.java b/calendarview/src/main/java/com/haibin/calendarview/YearView.java index e61b3956..f2faa802 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/YearView.java +++ b/calendarview/src/main/java/com/haibin/calendarview/YearView.java @@ -115,12 +115,12 @@ public abstract class YearView extends View { /** * 每一项的高度 */ - protected int mItemHeight; + protected float mItemHeight; /** * 每一项的宽度 */ - protected int mItemWidth; + protected float mItemWidth; /** * Text的基线 @@ -294,17 +294,17 @@ final void init(int year, int month) { * @param height height */ @SuppressWarnings("IntegerDivisionInFloatingPointContext") - final void measureSize(int width, int height) { + final void measureSize(float width, float height) { Rect rect = new Rect(); mCurMonthTextPaint.getTextBounds("1", 0, 1, rect); int textHeight = rect.height(); - int mMinHeight = 12 * textHeight + getMonthViewTop(); + float mMinHeight = 12 * textHeight + getMonthViewTop(); - int h = height >= mMinHeight ? height : mMinHeight; + float h = height >= mMinHeight ? height : mMinHeight; - getLayoutParams().width = width; - getLayoutParams().height = h; + getLayoutParams().width = (int) width; + getLayoutParams().height = (int) h; mItemHeight = (h - getMonthViewTop()) / 6; Paint.FontMetrics metrics = mCurMonthTextPaint.getFontMetrics(); @@ -371,7 +371,7 @@ private void onDrawMonth(Canvas canvas) { mDelegate.getYearViewMonthPaddingTop()); } - private int getMonthViewTop() { + private float getMonthViewTop() { return mDelegate.getYearViewMonthPaddingTop() + mDelegate.getYearViewMonthHeight() + mDelegate.getYearViewMonthPaddingBottom() + @@ -391,7 +391,7 @@ private void onDrawWeek(Canvas canvas) { if (week > 0) { week -= 1; } - int width = (getWidth() - + float width = (getWidth() - mDelegate.getYearViewMonthPaddingLeft() - mDelegate.getYearViewMonthPaddingRight()) / 7; for (int i = 0; i < 7; i++) { @@ -447,8 +447,8 @@ private void onDrawMonthView(Canvas canvas) { * @param d d */ private void draw(Canvas canvas, Calendar calendar, int i, int j, int d) { - int x = j * mItemWidth + mDelegate.getYearViewMonthPaddingLeft(); - int y = i * mItemHeight + getMonthViewTop(); + float x = j * mItemWidth + mDelegate.getYearViewMonthPaddingLeft(); + float y = i * mItemHeight + getMonthViewTop(); boolean isSelected = calendar.equals(mDelegate.mSelectedCalendar); boolean hasScheme = calendar.hasScheme(); @@ -495,7 +495,7 @@ protected void onPreviewHook() { * @param width width * @param height height */ - protected abstract void onDrawMonth(Canvas canvas, int year, int month, int x, int y, int width, int height); + protected abstract void onDrawMonth(Canvas canvas, int year, int month, float x, float y, float width, float height); /** @@ -508,7 +508,7 @@ protected void onPreviewHook() { * @param width width * @param height height */ - protected abstract void onDrawWeek(Canvas canvas, int week, int x, int y, int width, int height); + protected abstract void onDrawWeek(Canvas canvas, int week, float x, float y, float width, float height); /** @@ -521,7 +521,7 @@ protected void onPreviewHook() { * @param hasScheme hasScheme 非标记的日期 * @return 是否绘制onDrawScheme,true or false */ - protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme); + protected abstract boolean onDrawSelected(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme); /** * 绘制标记的日期,这里可以是背景色,标记色什么的 @@ -531,7 +531,7 @@ protected void onPreviewHook() { * @param x 日历Card x起点坐标 * @param y 日历Card y起点坐标 */ - protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y); + protected abstract void onDrawScheme(Canvas canvas, Calendar calendar, float x, float y); /** @@ -544,5 +544,5 @@ protected void onPreviewHook() { * @param hasScheme 是否是标记的日期 * @param isSelected 是否选中 */ - protected abstract void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected); + protected abstract void onDrawText(Canvas canvas, Calendar calendar, float x, float y, boolean hasScheme, boolean isSelected); } diff --git a/calendarview/src/main/java/com/haibin/calendarview/YearViewAdapter.java b/calendarview/src/main/java/com/haibin/calendarview/YearViewAdapter.java index d63f6d33..f222ca4b 100644 --- a/calendarview/src/main/java/com/haibin/calendarview/YearViewAdapter.java +++ b/calendarview/src/main/java/com/haibin/calendarview/YearViewAdapter.java @@ -26,7 +26,8 @@ final class YearViewAdapter extends BaseRecyclerAdapter { private CalendarViewDelegate mDelegate; - private int mItemWidth, mItemHeight; + private float mItemWidth; + private float mItemHeight; YearViewAdapter(Context context) { super(context); diff --git a/calendarview/src/main/res/layout/cv_layout_vertical_calendar_sticky_view.xml b/calendarview/src/main/res/layout/cv_layout_vertical_calendar_sticky_view.xml new file mode 100644 index 00000000..7c309f91 --- /dev/null +++ b/calendarview/src/main/res/layout/cv_layout_vertical_calendar_sticky_view.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/calendarview/src/main/res/layout/cv_layout_vertical_month_sticky_title.xml b/calendarview/src/main/res/layout/cv_layout_vertical_month_sticky_title.xml new file mode 100644 index 00000000..c6f5c551 --- /dev/null +++ b/calendarview/src/main/res/layout/cv_layout_vertical_month_sticky_title.xml @@ -0,0 +1,27 @@ + + + + + + + + + \ No newline at end of file diff --git a/calendarview/src/main/res/layout/cv_layout_vertical_month_sticky_view.xml b/calendarview/src/main/res/layout/cv_layout_vertical_month_sticky_view.xml new file mode 100644 index 00000000..17d77899 --- /dev/null +++ b/calendarview/src/main/res/layout/cv_layout_vertical_month_sticky_view.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/calendarview/src/main/res/values-zh-rHK/strings.xml b/calendarview/src/main/res/values-zh-rHK/strings.xml index d3f746b2..840c3ad6 100644 --- a/calendarview/src/main/res/values-zh-rHK/strings.xml +++ b/calendarview/src/main/res/values-zh-rHK/strings.xml @@ -1,7 +1,7 @@ CalendarView - 春節 + 正月 二月 三月 四月 @@ -74,7 +74,6 @@ 0910教師節 1001國慶日 1031萬聖節 - 1111光棍節 1224平安夜 1225聖誕節 diff --git a/calendarview/src/main/res/values-zh-rTW/strings.xml b/calendarview/src/main/res/values-zh-rTW/strings.xml index 63fb5e81..f492bafe 100644 --- a/calendarview/src/main/res/values-zh-rTW/strings.xml +++ b/calendarview/src/main/res/values-zh-rTW/strings.xml @@ -1,7 +1,7 @@ CalendarView - 春節 + 正月 二月 三月 四月 @@ -78,7 +78,6 @@ 0928教師節 1001國慶節 1031萬聖節 - 1111光棍節 1224平安夜 1225聖誕節 diff --git a/calendarview/src/main/res/values-zh/strings.xml b/calendarview/src/main/res/values-zh/strings.xml index 82972c7f..10e6ceea 100644 --- a/calendarview/src/main/res/values-zh/strings.xml +++ b/calendarview/src/main/res/values-zh/strings.xml @@ -1,7 +1,7 @@ CalendarView - 春节 + 正月 二月 三月 四月 @@ -74,7 +74,6 @@ 0910教师节 1001国庆节 1031万圣节 - 1111光棍节 1224平安夜 1225圣诞节 diff --git a/calendarview/src/main/res/values/ids.xml b/calendarview/src/main/res/values/ids.xml new file mode 100644 index 00000000..7c44382e --- /dev/null +++ b/calendarview/src/main/res/values/ids.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/calendarview/src/main/res/values/strings.xml b/calendarview/src/main/res/values/strings.xml index 7da6f777..c6d37460 100644 --- a/calendarview/src/main/res/values/strings.xml +++ b/calendarview/src/main/res/values/strings.xml @@ -1,7 +1,7 @@ CalendarView - 春节 + 正月 二月 三月 四月 @@ -74,7 +74,6 @@ 0910教师节 1001国庆节 1031万圣节 - 1111光棍节 1224平安夜 1225圣诞节 diff --git a/png/gif_sticky_vertical_scroll.gif b/png/gif_sticky_vertical_scroll.gif new file mode 100644 index 00000000..a4c4dc60 Binary files /dev/null and b/png/gif_sticky_vertical_scroll.gif differ