Index: chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackViewAnimation.java |
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackViewAnimation.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackViewAnimation.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..60a746e2b1ffdeaea9e0121ea3e200d0fcef6431 |
--- /dev/null |
+++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackViewAnimation.java |
@@ -0,0 +1,108 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.chrome.browser.compositor.layouts.phone.stack; |
+ |
+import android.animation.AnimatorSet; |
+import android.animation.ObjectAnimator; |
+import android.view.View; |
+import android.view.ViewGroup; |
+import android.view.ViewGroup.LayoutParams; |
+import android.widget.FrameLayout; |
+ |
+import org.chromium.chrome.browser.Tab; |
+import org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation.OverviewAnimationType; |
+import org.chromium.chrome.browser.tabmodel.TabModel; |
+import org.chromium.ui.base.LocalizationUtils; |
+import org.chromium.ui.interpolators.BakedBezierInterpolator; |
+ |
+/** |
+ * A factory that builds Android view animations for the tab stack. |
+ */ |
+public class StackViewAnimation { |
+ private static final int TAB_OPENED_ANIMATION_DURATION = 300; |
+ private static final float TAB_OPENED_PIVOT_INSET_DP = 24.f; |
+ |
+ private final float mDpToPx; |
+ private final float mWidthDp; |
+ |
+ /** |
+ * Constructor. |
+ * NOTE: Pass in height and heightMinusTopControls if they're ever needed. |
+ * |
+ * @param dpToPx The density of the device. |
+ * @param widthDp The width of the layout in dp. |
+ */ |
+ public StackViewAnimation(float dpToPx, float widthDp) { |
+ mDpToPx = dpToPx; |
+ mWidthDp = widthDp; |
+ } |
+ |
+ /** |
+ * The wrapper method responsible for delegating animation requests to the appropriate helper |
+ * method. |
+ * @param type The type of animation to be created. This is what determines which helper |
+ * method is called. |
+ * @param tabs The tabs that make up the current stack. |
+ * @param container The {@link ViewGroup} that {@link View}s can be added to/removed from. |
+ * @param model The {@link TabModel} that this animation will influence. |
+ * @param focusIndex The index of the tab that is the focus of this animation. |
+ * @return The resulting {@link AnimatorSet} that will animate the Android views. |
+ */ |
+ public AnimatorSet createAnimatorSetForType(OverviewAnimationType type, StackTab[] tabs, |
+ ViewGroup container, TabModel model, int focusIndex) { |
+ AnimatorSet set = null; |
+ |
+ if (model != null) { |
+ switch (type) { |
+ case NEW_TAB_OPENED: |
+ set = createNewTabOpenedAnimatorSet(tabs, container, model, focusIndex); |
+ break; |
+ default: |
+ break; |
+ } |
+ } |
+ |
+ return set; |
+ } |
+ |
+ private AnimatorSet createNewTabOpenedAnimatorSet( |
+ StackTab[] tabs, ViewGroup container, TabModel model, int focusIndex) { |
+ Tab tab = model.getTabAt(focusIndex); |
+ if (tab == null || !tab.isNativePage()) return null; |
+ |
+ View view = tab.getView(); |
+ if (view == null) return null; |
+ |
+ // Set up the view hierarchy |
+ if (view.getParent() != null) ((ViewGroup) view.getParent()).removeView(view); |
+ ViewGroup bgView = new FrameLayout(view.getContext()); |
+ bgView.setBackgroundColor(tab.getBackgroundColor()); |
+ bgView.addView(view); |
+ container.addView( |
+ bgView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); |
+ |
+ // Update any compositor state that needs to change |
+ if (tabs != null && focusIndex >= 0 && focusIndex < tabs.length) { |
+ tabs[focusIndex].setAlpha(0.f); |
+ } |
+ |
+ // Build the view animations |
+ ObjectAnimator xScale = ObjectAnimator.ofFloat(bgView, View.SCALE_X, 0.f, 1.f); |
+ ObjectAnimator yScale = ObjectAnimator.ofFloat(bgView, View.SCALE_Y, 0.f, 1.f); |
+ ObjectAnimator alpha = ObjectAnimator.ofFloat(bgView, View.ALPHA, 0.f, 1.f); |
+ |
+ AnimatorSet set = new AnimatorSet(); |
+ set.playTogether(xScale, yScale, alpha); |
+ |
+ set.setDuration(TAB_OPENED_ANIMATION_DURATION); |
+ set.setInterpolator(BakedBezierInterpolator.TRANSFORM_FOLLOW_THROUGH_CURVE); |
+ |
+ float insetPx = TAB_OPENED_PIVOT_INSET_DP * mDpToPx; |
+ |
+ bgView.setPivotY(TAB_OPENED_PIVOT_INSET_DP); |
+ bgView.setPivotX(LocalizationUtils.isLayoutRtl() ? mWidthDp * mDpToPx - insetPx : insetPx); |
+ return set; |
+ } |
+} |