fun FragmentMapHeaderBinding.expandSearchViewAnimation(deviceWindowInsetsProvider: DeviceWindowInsetsProvider) {
val cardRadiusAnim = ObjectAnimator.ofFloat(searchBarCard, "radius", searchBarCard.radius, 0f)
val marginsAnim = ObjectAnimator.ofPropertyValuesHolder(searchBarCard, *arrayOf<PropertyValuesHolder>()).apply {
val startMarginHorizontal = searchBarCard.marginLeft.toFloat()
val startMarginTop = searchBarCard.marginTop.toFloat()
var newHorizontalMargin = 0
var newTopMargin = 0
addUpdateListener {
val horizontalMargin = calculateAnimatedValue(startMarginHorizontal, 0f, it.animatedFraction).toInt()
val verticalMargin = calculateAnimatedValue(startMarginTop, 0f, it.animatedFraction).toInt()
if (horizontalMargin == newHorizontalMargin && verticalMargin == newTopMargin) return@addUpdateListener
newHorizontalMargin = horizontalMargin
newTopMargin = verticalMargin
searchBarCard.updateLayoutParams<ConstraintLayout.LayoutParams> {
leftMargin = newHorizontalMargin
rightMargin = newHorizontalMargin
topMargin = newTopMargin
}
}
}
val contentTopPaddingAnim = ObjectAnimator.ofPropertyValuesHolder(searchBarCard, *arrayOf<PropertyValuesHolder>()).apply {
val startContentPaddingTop = searchBarCard.contentPaddingTop
var newStartContentPaddingTop = 0
addUpdateListener {
val contentPaddingTop = calculateAnimatedValue(
startContentPaddingTop.toFloat(),
(deviceWindowInsetsProvider.statusBarInsets.top * 2).toFloat(), it.animatedFraction
).toInt()
if (contentPaddingTop == newStartContentPaddingTop) return@addUpdateListener
newStartContentPaddingTop = contentPaddingTop
searchBarCard.setContentPadding(
searchBarCard.contentPaddingLeft,
newStartContentPaddingTop,
searchBarCard.contentPaddingRight,
searchBarCard.contentPaddingBottom
)
}
}
AnimatorSet().apply {
duration = expandAnimationDuration
interpolator = FastOutSlowInInterpolator()
playTogether(cardRadiusAnim, marginsAnim, contentTopPaddingAnim)
startDelay = 200
start()
}
}