Untitled
unknown
kotlin
3 years ago
2.4 kB
4
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() } }
Editor is loading...