From 7a98e960068c4b384f408eb05ab85aab5374d0fd Mon Sep 17 00:00:00 2001 From: Cara Hurtle Date: Tue, 2 Feb 2021 17:38:36 -0800 Subject: [PATCH 1/3] Account for margins in calculating animation height --- .../com/kizitonwose/calendarview/ui/CalendarAdapter.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/library/src/main/java/com/kizitonwose/calendarview/ui/CalendarAdapter.kt b/library/src/main/java/com/kizitonwose/calendarview/ui/CalendarAdapter.kt index 149aa2d0..344c80c3 100644 --- a/library/src/main/java/com/kizitonwose/calendarview/ui/CalendarAdapter.kt +++ b/library/src/main/java/com/kizitonwose/calendarview/ui/CalendarAdapter.kt @@ -8,6 +8,7 @@ import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.annotation.LayoutRes +import androidx.core.view.MarginLayoutParamsCompat import androidx.core.view.ViewCompat import androidx.core.view.updateLayoutParams import androidx.recyclerview.widget.RecyclerView @@ -217,11 +218,13 @@ internal class CalendarAdapter( val visibleVH = calView.findViewHolderForAdapterPosition(visibleItemPos) as? MonthViewHolder ?: return val newHeight = visibleVH.headerView?.height.orZero() + + visibleVH.headerView?.getMarginHeight().orZero() + // visibleVH.bodyLayout.height` won't not give us the right height as it differs // depending on row count in the month. So we calculate the appropriate height // by checking the number of visible(non-empty) rows. visibleMonth.weekDays.size * calView.daySize.height + - visibleVH.footerView?.height.orZero() + visibleVH.footerView?.height.orZero() + + visibleVH.footerView?.getMarginHeight().orZero() if (calView.height != newHeight) { ValueAnimator.ofInt(calView.height, newHeight).apply { // Don't animate when the view is shown initially. @@ -281,6 +284,11 @@ internal class CalendarAdapter( fun findLastVisibleDay(): CalendarDay? = findVisibleDay(false) + private fun View.getMarginHeight(): Int { + val marginParams = layoutParams as? ViewGroup.MarginLayoutParams + return marginParams?.topMargin.orZero() + marginParams?.bottomMargin.orZero() + } + private fun findFirstVisibleMonthPosition(): Int = findVisibleMonthPosition(true) private fun findLastVisibleMonthPosition(): Int = findVisibleMonthPosition(false) From f99cce5a87cb473949ca0b6927112e8a7ebcf2e9 Mon Sep 17 00:00:00 2001 From: Cara Hurtle Date: Tue, 2 Feb 2021 17:42:45 -0800 Subject: [PATCH 2/3] remove stray import --- .../main/java/com/kizitonwose/calendarview/ui/CalendarAdapter.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/library/src/main/java/com/kizitonwose/calendarview/ui/CalendarAdapter.kt b/library/src/main/java/com/kizitonwose/calendarview/ui/CalendarAdapter.kt index 344c80c3..3e5ed61c 100644 --- a/library/src/main/java/com/kizitonwose/calendarview/ui/CalendarAdapter.kt +++ b/library/src/main/java/com/kizitonwose/calendarview/ui/CalendarAdapter.kt @@ -8,7 +8,6 @@ import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.annotation.LayoutRes -import androidx.core.view.MarginLayoutParamsCompat import androidx.core.view.ViewCompat import androidx.core.view.updateLayoutParams import androidx.recyclerview.widget.RecyclerView From 9001181a58e4f81107edd3901b017d0bb47a2fdf Mon Sep 17 00:00:00 2001 From: Cara Hurtle Date: Wed, 3 Feb 2021 09:11:01 -0800 Subject: [PATCH 3/3] Fixes from comments --- .../com/kizitonwose/calendarview/ui/CalendarAdapter.kt | 10 +++------- .../com/kizitonwose/calendarview/utils/Extensions.kt | 5 +++++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/library/src/main/java/com/kizitonwose/calendarview/ui/CalendarAdapter.kt b/library/src/main/java/com/kizitonwose/calendarview/ui/CalendarAdapter.kt index 3e5ed61c..c1dcd39e 100644 --- a/library/src/main/java/com/kizitonwose/calendarview/ui/CalendarAdapter.kt +++ b/library/src/main/java/com/kizitonwose/calendarview/ui/CalendarAdapter.kt @@ -14,6 +14,7 @@ import androidx.recyclerview.widget.RecyclerView import com.kizitonwose.calendarview.CalendarView import com.kizitonwose.calendarview.model.* import com.kizitonwose.calendarview.utils.NO_INDEX +import com.kizitonwose.calendarview.utils.getVerticalMargins import com.kizitonwose.calendarview.utils.inflate import com.kizitonwose.calendarview.utils.orZero import java.time.LocalDate @@ -217,13 +218,13 @@ internal class CalendarAdapter( val visibleVH = calView.findViewHolderForAdapterPosition(visibleItemPos) as? MonthViewHolder ?: return val newHeight = visibleVH.headerView?.height.orZero() + - visibleVH.headerView?.getMarginHeight().orZero() + + visibleVH.headerView?.getVerticalMargins().orZero() + // visibleVH.bodyLayout.height` won't not give us the right height as it differs // depending on row count in the month. So we calculate the appropriate height // by checking the number of visible(non-empty) rows. visibleMonth.weekDays.size * calView.daySize.height + visibleVH.footerView?.height.orZero() + - visibleVH.footerView?.getMarginHeight().orZero() + visibleVH.footerView?.getVerticalMargins().orZero() if (calView.height != newHeight) { ValueAnimator.ofInt(calView.height, newHeight).apply { // Don't animate when the view is shown initially. @@ -283,11 +284,6 @@ internal class CalendarAdapter( fun findLastVisibleDay(): CalendarDay? = findVisibleDay(false) - private fun View.getMarginHeight(): Int { - val marginParams = layoutParams as? ViewGroup.MarginLayoutParams - return marginParams?.topMargin.orZero() + marginParams?.bottomMargin.orZero() - } - private fun findFirstVisibleMonthPosition(): Int = findVisibleMonthPosition(true) private fun findLastVisibleMonthPosition(): Int = findVisibleMonthPosition(false) diff --git a/library/src/main/java/com/kizitonwose/calendarview/utils/Extensions.kt b/library/src/main/java/com/kizitonwose/calendarview/utils/Extensions.kt index 2c5264f3..dd9bbc98 100644 --- a/library/src/main/java/com/kizitonwose/calendarview/utils/Extensions.kt +++ b/library/src/main/java/com/kizitonwose/calendarview/utils/Extensions.kt @@ -34,3 +34,8 @@ internal val Rect.namedString: String internal val CoroutineScope.job: Job get() = requireNotNull(coroutineContext[Job]) + +internal fun View.getVerticalMargins(): Int { + val marginParams = layoutParams as? ViewGroup.MarginLayoutParams + return marginParams?.topMargin.orZero() + marginParams?.bottomMargin.orZero() +}