Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1406)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbarAnimationDelegate.java

Issue 1329793002: [Custom Tabs]Introduce the url scaling animation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbarAnimationDelegate.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbarAnimationDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbarAnimationDelegate.java
index 31a8b33ca9f5ea1facc8ac87319da5733688342e..f2f10ffcdd896092f9d0746b910b600928037277 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbarAnimationDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbarAnimationDelegate.java
@@ -8,13 +8,25 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.util.TypedValue;
import android.view.View;
+import android.widget.TextView;
import org.chromium.chrome.R;
import org.chromium.ui.interpolators.BakedBezierInterpolator;
/**
- * A delegate class to handle animations in {@link CustomTabToolbar}.
+ * A delegate class to handle the title animation and security icon fading animation in
+ * {@link CustomTabToolbar}.
+ * <p>
+ * How does the title animation work?
+ * <p>
+ * 1. The title bar is set from {@link View#GONE} to {@link View#VISIBLE}, which triggers a relayout
+ * of the location bar. 2. On relayout, the newly positioned urlbar will be moved&scaled to look
+ * exactly the same as before the relayout. (Note the scale factor is calculated based on
+ * {@link TextView#getTextSize()}, not height or width.) 3. Finally the urlbar will be animated to
+ * its new position.
*/
class CustomTabToolbarAnimationDelegate {
private static final int CUSTOM_TAB_TOOLBAR_SLIDE_DURATION_MS = 200;
@@ -24,6 +36,11 @@ class CustomTabToolbarAnimationDelegate {
private final AnimatorSet mSecurityButtonShowAnimator;
private final AnimatorSet mSecurityButtonHideAnimator;
+ private TextView mUrlBar;
+ private TextView mTitleBar;
+ // A flag controlling whether the animation has run before.
+ private boolean mShouldRunTitleAnimation;
+
/**
* Constructs an instance of {@link CustomTabToolbarAnimationDelegate}.
*/
@@ -70,6 +87,66 @@ class CustomTabToolbarAnimationDelegate {
mSecurityButtonHideAnimator.playSequentially(fadeOut, translateLeft);
}
+ void prepareTitleAnim(TextView urlBar, TextView titleBar) {
+ mTitleBar = titleBar;
+ mUrlBar = urlBar;
+ mUrlBar.setPivotX(0f);
+ mUrlBar.setPivotY(0f);
+ mShouldRunTitleAnimation = true;
+ }
+
+ /**
+ * Starts animation for urlbar scaling and title fading-in. If this animation has already run
+ * once, does nothing.
+ */
+ void startTitleAnimation(Context context) {
+ if (!mShouldRunTitleAnimation) return;
+ mShouldRunTitleAnimation = false;
+
+ mTitleBar.setVisibility(View.VISIBLE);
+ mTitleBar.setAlpha(0f);
+
+ float newSizeSp = context.getResources().getDimension(R.dimen.custom_tabs_url_text_size);
+
+ float oldSizePx = mUrlBar.getTextSize();
+ mUrlBar.setTextSize(TypedValue.COMPLEX_UNIT_PX, newSizeSp);
+ float newSizePx = mUrlBar.getTextSize();
+ final float scale = oldSizePx / newSizePx;
+
+ // View#getY() cannot be used because the boundary of the parent will change after relayout.
+ final int[] oldLoc = new int[2];
+ mUrlBar.getLocationInWindow(oldLoc);
+
+ mUrlBar.requestLayout();
+ mUrlBar.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
+ @Override
+ public void onLayoutChange(View v, int left, int top, int right, int bottom,
+ int oldLeft, int oldTop, int oldRight, int oldBottom) {
+ mUrlBar.removeOnLayoutChangeListener(this);
+
+ int[] newLoc = new int[2];
+ mUrlBar.getLocationInWindow(newLoc);
+
+ mUrlBar.setScaleX(scale);
+ mUrlBar.setScaleY(scale);
+ mUrlBar.setTranslationX(oldLoc[0] - newLoc[0]);
+ mUrlBar.setTranslationY(oldLoc[1] - newLoc[1]);
+
+ mUrlBar.animate().scaleX(1f).scaleY(1f).translationX(0).translationY(0)
+ .setDuration(CUSTOM_TAB_TOOLBAR_SLIDE_DURATION_MS)
+ .setInterpolator(BakedBezierInterpolator.TRANSFORM_CURVE)
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mTitleBar.animate().alpha(1f)
+ .setInterpolator(BakedBezierInterpolator.FADE_IN_CURVE)
+ .setDuration(CUSTOM_TAB_TOOLBAR_FADE_DURATION_MS).start();
+ }
+ }).start();
+ }
+ });
+ }
+
/**
* Starts the animation to show the security button. Will do nothing if the button is already
* visible.
« no previous file with comments | « chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698