Untitled

 avatar
unknown
kotlin
3 years ago
2.4 kB
3
Indexable
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()
    }
}