/// <summary> /// Builds the AnimatorSet that will create the expanding animation - the user will perceive the thumbnail getting bigger. /// </summary> /// <param name="expandedView">This is the ImageView that the thumbnail will scale up to.</param> /// <param name="startBounds">The visible rectangle of the thumbnail (global coordinates).</param> /// <param name="finalBounds">The visible rectangle of the full sized image (global coordinates).</param> /// <param name="startScale"></param> /// <returns></returns> private AnimatorSet BuildExpandingAnimatorSet(ImageView expandedView, Rect startBounds, Rect finalBounds, float startScale) { // Each expanding animator is unique to the start location - we'll cache the AnimatorSet // instance based on the starting location. int key = startBounds.GetHashCode (); if (_expandingAnimators.ContainsKey(key)) { return _expandingAnimators[key]; } AnimatorSet expandSet = new AnimatorSet(); expandSet.Play(ObjectAnimator.OfFloat(expandedView, View.X, startBounds.Left, finalBounds.Left)) .With(ObjectAnimator.OfFloat(expandedView, View.Y, startBounds.Top, finalBounds.Top)) .With(ObjectAnimator.OfFloat(expandedView, "ScaleX", startScale, 1f)) .With(ObjectAnimator.OfFloat(expandedView, "ScaleY", startScale, 1f)); expandSet.SetDuration(_shortAnimationDuration); expandSet.SetInterpolator(new DecelerateInterpolator()); expandSet.AnimationEnd += NullOutCurrentAnimator; expandSet.AnimationCancel += NullOutCurrentAnimator; _expandingAnimators.Add(key, expandSet); return expandSet; }