/** * Manage animation for Android >= KITKAT * * @param child */ private void ensureOrCancelAnimator(T child, bool withAnimation) { if (translationAnimator == null) { translationAnimator = ViewCompat.Animate(child); translationAnimator.SetDuration(withAnimation ? ANIM_DURATION : 0); translationAnimator.SetUpdateListener( new CustomViewPropertyAnimatorUpdateListener((view) => { // Animate snackbar if (snackbarLayout != null && snackbarLayout.LayoutParameters is ViewGroup.MarginLayoutParams) { targetOffset = view.MeasuredHeight - view.TranslationY; ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams)snackbarLayout.LayoutParameters; p.SetMargins(p.LeftMargin, p.TopMargin, p.RightMargin, (int)targetOffset); snackbarLayout.RequestLayout(); } // Animate Floating Action Button if (floatingActionButton != null && floatingActionButton.LayoutParameters is ViewGroup.MarginLayoutParams) { ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams)floatingActionButton.LayoutParameters; fabTargetOffset = fabDefaultBottomMargin - view.TranslationY + snackBarY; p.SetMargins(p.LeftMargin, p.TopMargin, p.RightMargin, (int)fabTargetOffset); floatingActionButton.RequestLayout(); } // Pass navigation height to listener if (navigationPositionListener != null) { navigationPositionListener.onPositionChange((int)(view.MeasuredHeight - view.TranslationY + snackBarY)); } }) ); translationAnimator.SetInterpolator(INTERPOLATOR); } else { translationAnimator.SetDuration(withAnimation ? ANIM_DURATION : 0); translationAnimator.Cancel(); } }