diff --git a/javasample/src/main/java/jp/co/recruit_mp/android/lightcalendarview/javasample/MainActivity.java b/javasample/src/main/java/jp/co/recruit_mp/android/lightcalendarview/javasample/MainActivity.java index 5311ecd..9a04e48 100644 --- a/javasample/src/main/java/jp/co/recruit_mp/android/lightcalendarview/javasample/MainActivity.java +++ b/javasample/src/main/java/jp/co/recruit_mp/android/lightcalendarview/javasample/MainActivity.java @@ -43,6 +43,11 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { calendarView.setMonthFrom(calFrom.getTime()); calendarView.setMonthTo(calTo.getTime()); calendarView.setMonthCurrent(calNow.getTime()); + // 前月・翌月を表示する + calendarView.setDisplayOutside(true); + // 当日の強調表示固定 + calendarView.setFixToday(true); + calendarView.setOnMonthSelected(new Function2() { @Override public Unit invoke(Date date, final MonthView monthView) { @@ -53,11 +58,16 @@ public Unit invoke(Date date, final MonthView monthView) { public void run() { Calendar cal = Calendar.getInstance(); List dates = new ArrayList(); + List holidays = new ArrayList(); for (int i = 0; i < 31; i++) { if (i % 2 == 0) { cal.set(monthView.getMonth().getYear() + 1900, monthView.getMonth().getMonth(), i); dates.add(cal.getTime()); } + if (i < 7) { + cal.set(monthView.getMonth().getYear() + 1900, monthView.getMonth().getMonth(), i); + holidays.add(cal.getTime()); + } } HashMap> map = new HashMap<>(); for (Date date : dates) { @@ -68,6 +78,8 @@ public void run() { map.put(date, accents); } monthView.setAccents(map); + // 祝日を設定 + monthView.setHolidays(holidays); } }, 1000); diff --git a/javasample/src/main/res/layout/activity_main.xml b/javasample/src/main/res/layout/activity_main.xml index a5a00a7..e6559c7 100644 --- a/javasample/src/main/res/layout/activity_main.xml +++ b/javasample/src/main/res/layout/activity_main.xml @@ -23,11 +23,13 @@ android:id="@+id/calendarView" android:layout_width="match_parent" android:layout_height="wrap_content" - app:lcv_weekDayTextSize="18sp" - app:lcv_dayTextSize="18sp" + app:lcv_weekDayTextSize="12sp" + app:lcv_dayTextSize="12sp" app:lcv_textColor="@color/calendar_day_text" app:lcv_selectionColor="@color/calendar_selection" app:lcv_accentColor="@color/calendar_accent" + app:lcv_outsideTextColor="#ccc" + app:lcv_holidayTextColor="#CD0303" app:lcv_firstDayOfWeek="@integer/lcv_monday"/> diff --git a/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/CalendarSettings.kt b/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/CalendarSettings.kt index a5ee870..394d2f8 100644 --- a/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/CalendarSettings.kt +++ b/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/CalendarSettings.kt @@ -35,6 +35,10 @@ class CalendarSettings(private val context: Context) : ObservableSettings() { val dayView = DayView(observer) var timeZone: TimeZone = TimeZone.getDefault() var locale: Locale = Locale.getDefault() + var displayOutside: Boolean = false + + // 当日を常に強調表示 + var fixToday: Boolean = false // settings for DayLayout and WeekDayLayout: first day of the week var firstDayOfWeek: WeekDay = WeekDay.SUNDAY @@ -118,6 +122,7 @@ class CalendarSettings(private val context: Context) : ObservableSettings() { todayTextPaint.textSize(value) selectedTextPaint.textSize(value) selectedTodayTextPaint.textSize(value) + outsideTextPaint.textSize(value) } private val textFilterColorMap: MutableMap = WeekDay.values().map { @@ -169,6 +174,8 @@ class CalendarSettings(private val context: Context) : ObservableSettings() { // ------------ Text --------------------------------------------------------------------------------------- internal fun defaultTextPaint(weekDay: WeekDay): Paint = defaultTextPaints[weekDay] ?: throw IllegalStateException("cannot find default Paint with weekDay - $weekDay") + internal var outsideTextPaint: Paint = initializeOutsideTextPaint() + internal var holidayTextPaint: Paint = initializeHolidayTextPaint() internal var defaultTextPaints: Map = initializedDefaultTextPaints() internal var todayTextPaint: Paint = initializedTodayTextPaint() internal var selectedTextPaint: Paint = initializeSelectedTextPaint() @@ -178,6 +185,8 @@ class CalendarSettings(private val context: Context) : ObservableSettings() { it to baseTextPaint.copy().colorFilter(textFilterColorMap[it]?.let { color -> PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP) } ?: throw IllegalStateException("Day color map for $it not found.")) }.toMap() + private fun initializeOutsideTextPaint() = baseTextPaint.copy().color(context.getStyledColor(android.R.attr.textColorPrimary, context.getColorCompat(R.color.light_calendar_view__day_today_text_color))) + private fun initializeHolidayTextPaint() = baseTextPaint.copy().color(context.getStyledColor(android.R.attr.textColorPrimary, context.getColorCompat(R.color.light_calendar_view__day_today_text_color))) private fun initializedTodayTextPaint() = baseTextPaint.copy().color(context.getStyledColor(android.R.attr.textColorPrimary, context.getColorCompat(R.color.light_calendar_view__day_today_text_color))) private fun initializeSelectedTextPaint() = baseTextPaint.copy().typeface(Typeface.DEFAULT_BOLD).color(context.getStyledColor(android.R.attr.textColorPrimaryInverse, context.getColorCompat(R.color.light_calendar_view__day_selected_text_color))) private fun initializedSelectedTodayTextPaint() = baseTextPaint.copy().typeface(Typeface.DEFAULT_BOLD).color(context.getStyledColor(android.R.attr.textColorPrimaryInverse, context.getColorCompat(R.color.light_calendar_view__day_selected_today_text_color))) @@ -206,6 +215,13 @@ class CalendarSettings(private val context: Context) : ObservableSettings() { selectedTextPaint.color(colorStateList, State.SELECTED) selectedTodayTextPaint.color(colorStateList, State.SELECTED_TODAY) } + internal fun setOutsideTextColorStateList(color:Int) { + outsideTextPaint.color = color + } + + internal fun setHolidayTextColorStateList(color: Int) { + holidayTextPaint.color = color + } internal fun setTextFilterColor(weekDay: WeekDay, color: Int?) { textFilterColorMap[weekDay] = color diff --git a/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/DayLayout.kt b/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/DayLayout.kt index ea1331f..210f1f9 100644 --- a/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/DayLayout.kt +++ b/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/DayLayout.kt @@ -18,6 +18,7 @@ package jp.co.recruit_mp.android.lightcalendarview import android.content.Context import android.support.v4.view.ViewCompat +import android.text.format.DateUtils import java.util.* /** @@ -106,7 +107,11 @@ class DayLayout(context: Context, settings: CalendarSettings, var month: Date) : addView(instantiateDayView(cal.clone() as Calendar)) } else -> { - addView(EmptyView(context, settings)) + if (settings.displayOutside) { + addView(instantiateDayView(cal.clone() as Calendar).setOutside()) + } else { + addView(EmptyView(context, settings)) + } } } cal.add(Calendar.DAY_OF_YEAR, 1) @@ -135,8 +140,11 @@ class DayLayout(context: Context, settings: CalendarSettings, var month: Date) : private fun setSelectedDay(view: DayView?) { selectedDayView?.apply { - isSelected = false - updateState() + if (!settings.fixToday || !DateUtils.isToday(selectedDayView?.date!!.time)) { + // 今日の場合は常に丸を表示させる + isSelected = false + updateState() + } } selectedDayView = view?.apply { isSelected = true diff --git a/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/DayView.kt b/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/DayView.kt index 4d9f576..dc7ab74 100644 --- a/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/DayView.kt +++ b/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/DayView.kt @@ -54,6 +54,8 @@ class DayView(context: Context, settings: CalendarSettings, cal: Calendar) : Cel private var accentsCenterY: Float = 0f private var drawCircle: Boolean = false + private var isOutside: Boolean = false + private var isHoliday: Boolean = false private var radius: Float = 0f private var currentRadius: Float = 0f @@ -110,6 +112,15 @@ class DayView(context: Context, settings: CalendarSettings, cal: Calendar) : Cel animateAccents() } + fun setOutside():DayView { + this.isOutside = true + return this + } + // 祝日に設定 + fun setHoliday() { + this.isHoliday = true + updatePaint(); + } // 各アクセントの位置を設定する private fun layoutAccents() { // アクセント左端の位置を計算 @@ -184,7 +195,6 @@ class DayView(context: Context, settings: CalendarSettings, cal: Calendar) : Cel /** 状態を更新する. {@link DayLayout} から呼ばれることを想定している. */ internal fun updateState() { drawCircle = isSelected || fadeInAnim.isRunning || fadeOutAnim.isRunning - updatePaint() } @@ -209,6 +219,15 @@ class DayView(context: Context, settings: CalendarSettings, cal: Calendar) : Cel textPaint = settings.dayView.todayTextPaint accentPaint = settings.dayView.todayAccentPaint } + isOutside -> { + textPaint = settings.dayView.outsideTextPaint + accentPaint = settings.dayView.defaultAccentPaint + } + // 祝日の設定 + isHoliday -> { + textPaint = settings.dayView.holidayTextPaint + accentPaint = settings.dayView.defaultAccentPaint + } else -> { textPaint = settings.dayView.defaultTextPaint(weekDay) accentPaint = settings.dayView.defaultAccentPaint diff --git a/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/LightCalendarView.kt b/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/LightCalendarView.kt index 98a138c..a535bae 100644 --- a/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/LightCalendarView.kt +++ b/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/LightCalendarView.kt @@ -79,6 +79,8 @@ class LightCalendarView(context: Context, attrs: AttributeSet? = null, defStyleA R.styleable.LightCalendarView_lcv_selectionColor -> setSelectionColor(a.getColorStateList(attr)) R.styleable.LightCalendarView_lcv_accentColor -> setAccentColor(a.getColorStateList(attr)) R.styleable.LightCalendarView_lcv_firstDayOfWeek -> setFirstDayOfWeek(a.getInt(attr, 0)) + R.styleable.LightCalendarView_lcv_outsideTextColor -> setOutsideTextColor(a.getColor(attr, 0)) + R.styleable.LightCalendarView_lcv_holidayTextColor -> setHolidayTextColor(a.getColor(attr, 0)) } } a.recycle() @@ -177,6 +179,23 @@ class LightCalendarView(context: Context, attrs: AttributeSet? = null, defStyleA }.notifySettingsChanged() } + /** + * 前月・翌月の文字色を設定する + */ + fun setOutsideTextColor(color: Int) { + settings.dayView.apply { + setOutsideTextColorStateList(color) + }.notifySettingsChanged() + } + /** + * 祝日の文字色を設定する + */ + fun setHolidayTextColor(color: Int) { + settings.dayView.apply { + setHolidayTextColorStateList(color) + }.notifySettingsChanged() + } + /** * 日付ビューの選択時の背景色を設定する */ @@ -227,6 +246,13 @@ class LightCalendarView(context: Context, attrs: AttributeSet? = null, defStyleA firstDayOfWeek = WeekDay.fromOrdinal(n) } + var displayOutside: Boolean + get() = settings.displayOutside + set(value) { + settings.apply { + displayOutside = value + }.notifySettingsChanged() + } /** * Sets the timezone to use in LightCalendarView. * Set null to use TimeZone.getDefault() @@ -239,6 +265,13 @@ class LightCalendarView(context: Context, attrs: AttributeSet? = null, defStyleA }.notifySettingsChanged() } + var fixToday: Boolean + get() = settings.fixToday + set(value) { + settings.apply { + fixToday = value + }.notifySettingsChanged() + } /** * Sets the locale to use in LightCalendarView. * Set null to use Locale.getDefault() diff --git a/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/MonthView.kt b/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/MonthView.kt index a4422f9..5dddb70 100644 --- a/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/MonthView.kt +++ b/library/src/main/kotlin/jp/co/recruit_mp/android/lightcalendarview/MonthView.kt @@ -59,6 +59,13 @@ class MonthView(context: Context, settings: CalendarSettings, var month: Date) : dayLayout.invalidateDayViews() } + // 祝日追加 + fun setHolidays(map: Collection) { + map.forEach { it -> + val date = it + dayLayout.getDayView(date)?.setHoliday(); + } + } override fun toString(): String = "MonthView($month)" } diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml index fad60f2..4bce3d6 100644 --- a/library/src/main/res/values/attrs.xml +++ b/library/src/main/res/values/attrs.xml @@ -7,5 +7,7 @@ + + - \ No newline at end of file +