All apps transition work

-> Fix icons popping in
-> Fix issue 17259204
-> posting animation start and buildLayer to allow first
   frame to be ready. This becomes necessary with RevealAnimator
   on the render thread, since it can't use FirstFrameAnimatorHelper
   any longer.
-> adding a bit better transition for K, issue 17252683
-> updating a few assets

Change-Id: I0b193b4b3b511492a2fad6230cd91e3f0de634f0
This commit is contained in:
Adam Cohen 2014-08-27 16:04:07 -07:00
parent d750f8b3f7
commit 2854d25619
14 changed files with 215 additions and 194 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 705 B

After

Width:  |  Height:  |  Size: 744 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 476 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 900 B

After

Width:  |  Height:  |  Size: 928 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -22,6 +22,7 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet; import android.animation.AnimatorSet;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder; import android.animation.PropertyValuesHolder;
import android.animation.TimeInterpolator;
import android.animation.ValueAnimator; import android.animation.ValueAnimator;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.Activity; import android.app.Activity;
@ -82,6 +83,7 @@ import android.view.Surface;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener; import android.view.View.OnLongClickListener;
import android.view.ViewAnimationUtils;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewTreeObserver; import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.ViewTreeObserver.OnGlobalLayoutListener;
@ -90,6 +92,7 @@ import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityEvent;
import android.view.animation.AccelerateInterpolator; import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator; import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.Advanceable; import android.widget.Advanceable;
import android.widget.FrameLayout; import android.widget.FrameLayout;
@ -3202,10 +3205,12 @@ public class Launcher extends Activity
final View fromView = mWorkspace; final View fromView = mWorkspace;
final AppsCustomizeTabHost toView = mAppsCustomizeTabHost; final AppsCustomizeTabHost toView = mAppsCustomizeTabHost;
final ArrayList<View> layerViews = new ArrayList<View>();
Workspace.State workspaceState = contentType == AppsCustomizePagedView.ContentType.Widgets ? Workspace.State workspaceState = contentType == AppsCustomizePagedView.ContentType.Widgets ?
Workspace.State.OVERVIEW_HIDDEN : Workspace.State.NORMAL_HIDDEN; Workspace.State.OVERVIEW_HIDDEN : Workspace.State.NORMAL_HIDDEN;
Animator workspaceAnim = Animator workspaceAnim =
mWorkspace.getChangeStateAnimation(workspaceState, animated); mWorkspace.getChangeStateAnimation(workspaceState, animated, layerViews);
if (!LauncherAppState.isDisableAllApps() if (!LauncherAppState.isDisableAllApps()
|| contentType == AppsCustomizePagedView.ContentType.Widgets) { || contentType == AppsCustomizePagedView.ContentType.Widgets) {
// Set the content type for the all apps/widgets space // Set the content type for the all apps/widgets space
@ -3214,7 +3219,6 @@ public class Launcher extends Activity
if (animated) { if (animated) {
mStateAnimation = LauncherAnimUtils.createAnimatorSet(); mStateAnimation = LauncherAnimUtils.createAnimatorSet();
final AppsCustomizePagedView content = (AppsCustomizePagedView) final AppsCustomizePagedView content = (AppsCustomizePagedView)
toView.findViewById(R.id.apps_customize_pane_content); toView.findViewById(R.id.apps_customize_pane_content);
@ -3231,32 +3235,46 @@ public class Launcher extends Activity
} }
// Hide the real page background, and swap in the fake one // Hide the real page background, and swap in the fake one
revealView.setVisibility(View.VISIBLE);
content.setPageBackgroundsVisible(false); content.setPageBackgroundsVisible(false);
revealView.setVisibility(View.VISIBLE);
// We need to hide this view as the animation start will be posted.
revealView.setAlpha(0);
int width = revealView.getMeasuredWidth(); int width = revealView.getMeasuredWidth();
int height = revealView.getMeasuredHeight(); int height = revealView.getMeasuredHeight();
float revealRadius = (float) Math.sqrt((width * width) / 4 + (height * height) / 4); float revealRadius = (float) Math.sqrt((width * width) / 4 + (height * height) / 4);
revealView.setTranslationY(0); revealView.setTranslationY(0);
revealView.setTranslationX(0); revealView.setTranslationX(0);
// Get the y delta between the center of the page and the center of the all apps button // Get the y delta between the center of the page and the center of the all apps button
int[] allAppsToPanelDelta = Utilities.getCenterDeltaInScreenSpace(revealView, int[] allAppsToPanelDelta = Utilities.getCenterDeltaInScreenSpace(revealView,
getAllAppsButton(), null); getAllAppsButton(), null);
float yDrift = isWidgetTray ? height / 2 : allAppsToPanelDelta[1];
float xDrift = isWidgetTray ? 0 : allAppsToPanelDelta[0];
float initAlpha = isWidgetTray ? 0.3f : 1f; float alpha = 0;
float xDrift = 0;
float yDrift = 0;
if (material) {
alpha = isWidgetTray ? 0.3f : 1f;
yDrift = isWidgetTray ? height / 2 : allAppsToPanelDelta[1];
xDrift = isWidgetTray ? 0 : allAppsToPanelDelta[0];
} else {
yDrift = 2 * height / 3;
xDrift = 0;
}
final float initAlpha = alpha;
revealView.setLayerType(View.LAYER_TYPE_HARDWARE, null); revealView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
layerViews.add(revealView);
PropertyValuesHolder panelAlpha = PropertyValuesHolder.ofFloat("alpha", initAlpha, 1f); PropertyValuesHolder panelAlpha = PropertyValuesHolder.ofFloat("alpha", initAlpha, 1f);
PropertyValuesHolder panelDriftY = PropertyValuesHolder panelDriftY =
PropertyValuesHolder.ofFloat("translationY", yDrift, 0); PropertyValuesHolder.ofFloat("translationY", yDrift, 0);
PropertyValuesHolder panelDriftX = PropertyValuesHolder panelDriftX =
PropertyValuesHolder.ofFloat("translationX", xDrift, 0); PropertyValuesHolder.ofFloat("translationX", xDrift, 0);
ObjectAnimator panelAlphaAndDrift = ObjectAnimator panelAlphaAndDrift = ObjectAnimator.ofPropertyValuesHolder(revealView,
LauncherAnimUtils.ofPropertyValuesHolder(revealView, panelAlpha, panelDriftY, panelDriftX); panelAlpha, panelDriftY, panelDriftX);
panelAlphaAndDrift.setDuration(revealDuration); panelAlphaAndDrift.setDuration(revealDuration);
panelAlphaAndDrift.setInterpolator(new LogDecelerateInterpolator(100, 0)); panelAlphaAndDrift.setInterpolator(new LogDecelerateInterpolator(100, 0));
@ -3265,15 +3283,17 @@ public class Launcher extends Activity
if (page != null) { if (page != null) {
page.setVisibility(View.VISIBLE); page.setVisibility(View.VISIBLE);
page.setLayerType(View.LAYER_TYPE_HARDWARE, null); page.setLayerType(View.LAYER_TYPE_HARDWARE, null);
layerViews.add(page);
ObjectAnimator pageDrift = LauncherAnimUtils.ofFloat(page, "translationY", yDrift, 0); ObjectAnimator pageDrift = ObjectAnimator.ofFloat(page, "translationY", yDrift, 0);
page.setTranslationY(yDrift);
pageDrift.setDuration(revealDuration); pageDrift.setDuration(revealDuration);
pageDrift.setInterpolator(new LogDecelerateInterpolator(100, 0)); pageDrift.setInterpolator(new LogDecelerateInterpolator(100, 0));
pageDrift.setStartDelay(itemsAlphaStagger); pageDrift.setStartDelay(itemsAlphaStagger);
mStateAnimation.play(pageDrift); mStateAnimation.play(pageDrift);
page.setAlpha(0f); page.setAlpha(0f);
ObjectAnimator itemsAlpha = LauncherAnimUtils.ofFloat(page, "alpha", 0f, 1f); ObjectAnimator itemsAlpha = ObjectAnimator.ofFloat(page, "alpha", 0f, 1f);
itemsAlpha.setDuration(revealDuration); itemsAlpha.setDuration(revealDuration);
itemsAlpha.setInterpolator(new AccelerateInterpolator(1.5f)); itemsAlpha.setInterpolator(new AccelerateInterpolator(1.5f));
itemsAlpha.setStartDelay(itemsAlphaStagger); itemsAlpha.setStartDelay(itemsAlphaStagger);
@ -3283,7 +3303,7 @@ public class Launcher extends Activity
View pageIndicators = toView.findViewById(R.id.apps_customize_page_indicator); View pageIndicators = toView.findViewById(R.id.apps_customize_page_indicator);
pageIndicators.setAlpha(0.01f); pageIndicators.setAlpha(0.01f);
ObjectAnimator indicatorsAlpha = ObjectAnimator indicatorsAlpha =
LauncherAnimUtils.ofFloat(pageIndicators, "alpha", 1f); ObjectAnimator.ofFloat(pageIndicators, "alpha", 1f);
indicatorsAlpha.setDuration(revealDuration); indicatorsAlpha.setDuration(revealDuration);
mStateAnimation.play(indicatorsAlpha); mStateAnimation.play(indicatorsAlpha);
@ -3292,7 +3312,7 @@ public class Launcher extends Activity
int allAppsButtonSize = LauncherAppState.getInstance(). int allAppsButtonSize = LauncherAppState.getInstance().
getDynamicGrid().getDeviceProfile().allAppsButtonVisualSize; getDynamicGrid().getDeviceProfile().allAppsButtonVisualSize;
float startRadius = isWidgetTray ? 0 : allAppsButtonSize / 2; float startRadius = isWidgetTray ? 0 : allAppsButtonSize / 2;
Animator reveal = LauncherAnimUtils.createCircularReveal(revealView, width / 2, Animator reveal = ViewAnimationUtils.createCircularReveal(revealView, width / 2,
height / 2, startRadius, revealRadius); height / 2, startRadius, revealRadius);
reveal.setDuration(revealDuration); reveal.setDuration(revealDuration);
reveal.setInterpolator(new LogDecelerateInterpolator(100, 0)); reveal.setInterpolator(new LogDecelerateInterpolator(100, 0));
@ -3309,7 +3329,6 @@ public class Launcher extends Activity
} }
} }
}); });
mStateAnimation.play(reveal); mStateAnimation.play(reveal);
} }
@ -3332,29 +3351,14 @@ public class Launcher extends Activity
} }
} }
@Override
public void onAnimationStart(Animator animation) {
// Prepare the position
toView.bringToFront();
toView.setVisibility(View.VISIBLE);
}
}); });
boolean delayAnim = false;
if (workspaceAnim != null) { if (workspaceAnim != null) {
mStateAnimation.play(workspaceAnim); mStateAnimation.play(workspaceAnim);
} }
dispatchOnLauncherTransitionPrepare(fromView, animated, false); dispatchOnLauncherTransitionPrepare(fromView, animated, false);
dispatchOnLauncherTransitionPrepare(toView, animated, false); dispatchOnLauncherTransitionPrepare(toView, animated, false);
// If any of the objects being animated haven't been measured/laid out
// yet, delay the animation until we get a layout pass
if ((((LauncherTransitionable) toView).getContent().getMeasuredWidth() == 0) ||
(mWorkspace.getMeasuredWidth() == 0) ||
(toView.getMeasuredWidth() == 0)) {
delayAnim = true;
}
final AnimatorSet stateAnimation = mStateAnimation; final AnimatorSet stateAnimation = mStateAnimation;
final Runnable startAnimRunnable = new Runnable() { final Runnable startAnimRunnable = new Runnable() {
public void run() { public void run() {
@ -3364,22 +3368,20 @@ public class Launcher extends Activity
return; return;
dispatchOnLauncherTransitionStart(fromView, animated, false); dispatchOnLauncherTransitionStart(fromView, animated, false);
dispatchOnLauncherTransitionStart(toView, animated, false); dispatchOnLauncherTransitionStart(toView, animated, false);
LauncherAnimUtils.startAnimationAfterNextDraw(mStateAnimation, toView);
revealView.setAlpha(initAlpha);
if (Utilities.isLmp()) {
for (int i = 0; i < layerViews.size(); i++) {
View v = layerViews.get(i);
if (v != null) v.buildLayer();
}
}
mStateAnimation.start();
} }
}; };
if (delayAnim) {
toView.bringToFront(); toView.bringToFront();
toView.setVisibility(View.VISIBLE); toView.setVisibility(View.VISIBLE);
final ViewTreeObserver observer = toView.getViewTreeObserver(); toView.post(startAnimRunnable);
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
startAnimRunnable.run();
toView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
} else {
startAnimRunnable.run();
}
} else { } else {
toView.setTranslationX(0.0f); toView.setTranslationX(0.0f);
toView.setTranslationY(0.0f); toView.setTranslationY(0.0f);
@ -3431,18 +3433,22 @@ public class Launcher extends Activity
final View fromView = mAppsCustomizeTabHost; final View fromView = mAppsCustomizeTabHost;
final View toView = mWorkspace; final View toView = mWorkspace;
Animator workspaceAnim = null; Animator workspaceAnim = null;
final ArrayList<View> layerViews = new ArrayList<View>();
if (toState == Workspace.State.NORMAL) { if (toState == Workspace.State.NORMAL) {
workspaceAnim = mWorkspace.getChangeStateAnimation( workspaceAnim = mWorkspace.getChangeStateAnimation(
toState, animated); toState, animated, layerViews);
} else if (toState == Workspace.State.SPRING_LOADED || } else if (toState == Workspace.State.SPRING_LOADED ||
toState == Workspace.State.OVERVIEW) { toState == Workspace.State.OVERVIEW) {
workspaceAnim = mWorkspace.getChangeStateAnimation( workspaceAnim = mWorkspace.getChangeStateAnimation(
toState, animated); toState, animated, layerViews);
} }
showHotseat(animated);
if (animated) { if (animated) {
mStateAnimation = LauncherAnimUtils.createAnimatorSet(); mStateAnimation = LauncherAnimUtils.createAnimatorSet();
if (workspaceAnim != null) {
mStateAnimation.play(workspaceAnim);
}
final AppsCustomizePagedView content = (AppsCustomizePagedView) final AppsCustomizePagedView content = (AppsCustomizePagedView)
fromView.findViewById(R.id.apps_customize_pane_content); fromView.findViewById(R.id.apps_customize_pane_content);
@ -3450,8 +3456,13 @@ public class Launcher extends Activity
final View page = content.getPageAt(content.getNextPage()); final View page = content.getPageAt(content.getNextPage());
final View revealView = fromView.findViewById(R.id.fake_page); final View revealView = fromView.findViewById(R.id.fake_page);
// hideAppsCustomizeHelper is called in some cases when it is already hidden
// don't perform all these no-op animations. In particularly, this was causing
// the all-apps button to pop in and out.
if (fromView.getVisibility() == View.VISIBLE) {
AppsCustomizePagedView.ContentType contentType = content.getContentType(); AppsCustomizePagedView.ContentType contentType = content.getContentType();
final boolean isWidgetTray = contentType == AppsCustomizePagedView.ContentType.Widgets; final boolean isWidgetTray =
contentType == AppsCustomizePagedView.ContentType.Widgets;
if (isWidgetTray) { if (isWidgetTray) {
revealView.setBackground(res.getDrawable(R.drawable.quantum_panel_dark)); revealView.setBackground(res.getDrawable(R.drawable.quantum_panel_dark));
@ -3471,30 +3482,47 @@ public class Launcher extends Activity
revealView.setTranslationY(0); revealView.setTranslationY(0);
int[] allAppsToPanelDelta = Utilities.getCenterDeltaInScreenSpace(revealView, int[] allAppsToPanelDelta = Utilities.getCenterDeltaInScreenSpace(revealView,
allAppsButton, null); allAppsButton, null);
float yDrift = isWidgetTray ? height / 2 : allAppsToPanelDelta[1];
float xDrift = isWidgetTray ? 0 : allAppsToPanelDelta[0]; float xDrift = 0;
float yDrift = 0;
if (material) {
yDrift = isWidgetTray ? height / 2 : allAppsToPanelDelta[1];
xDrift = isWidgetTray ? 0 : allAppsToPanelDelta[0];
} else {
yDrift = 5 * height / 4;
xDrift = 0;
}
revealView.setLayerType(View.LAYER_TYPE_HARDWARE, null); revealView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
TimeInterpolator decelerateInterpolator = material ?
new LogDecelerateInterpolator(100, 0) :
new LogDecelerateInterpolator(30, 0);
// The vertical motion of the apps panel should be delayed by one frame // The vertical motion of the apps panel should be delayed by one frame
// from the conceal animation in order to give the right feel. We correpsondingly // from the conceal animation in order to give the right feel. We correpsondingly
// shorten the duration so that the slide and conceal end at the same time. // shorten the duration so that the slide and conceal end at the same time.
ObjectAnimator panelDriftY = LauncherAnimUtils.ofFloat(revealView, "translationY", 0, yDrift); ObjectAnimator panelDriftY = LauncherAnimUtils.ofFloat(revealView, "translationY",
0, yDrift);
panelDriftY.setDuration(revealDuration - SINGLE_FRAME_DELAY); panelDriftY.setDuration(revealDuration - SINGLE_FRAME_DELAY);
panelDriftY.setStartDelay(itemsAlphaStagger + SINGLE_FRAME_DELAY); panelDriftY.setStartDelay(itemsAlphaStagger + SINGLE_FRAME_DELAY);
panelDriftY.setInterpolator(new LogDecelerateInterpolator(100, 0)); panelDriftY.setInterpolator(decelerateInterpolator);
mStateAnimation.play(panelDriftY); mStateAnimation.play(panelDriftY);
ObjectAnimator panelDriftX = LauncherAnimUtils.ofFloat(revealView, "translationX", 0, xDrift); ObjectAnimator panelDriftX = LauncherAnimUtils.ofFloat(revealView, "translationX",
0, xDrift);
panelDriftX.setDuration(revealDuration - SINGLE_FRAME_DELAY); panelDriftX.setDuration(revealDuration - SINGLE_FRAME_DELAY);
panelDriftX.setStartDelay(itemsAlphaStagger + SINGLE_FRAME_DELAY); panelDriftX.setStartDelay(itemsAlphaStagger + SINGLE_FRAME_DELAY);
panelDriftX.setInterpolator(new LogDecelerateInterpolator(100, 0)); panelDriftX.setInterpolator(decelerateInterpolator);
mStateAnimation.play(panelDriftX); mStateAnimation.play(panelDriftX);
if (isWidgetTray) { if (isWidgetTray || !material) {
ObjectAnimator panelAlpha = LauncherAnimUtils.ofFloat(revealView, "alpha", 1f, 0.4f); float finalAlpha = material ? 0.4f : 0f;
revealView.setAlpha(1f);
ObjectAnimator panelAlpha = LauncherAnimUtils.ofFloat(revealView, "alpha",
1f, finalAlpha);
panelAlpha.setDuration(revealDuration); panelAlpha.setDuration(revealDuration);
panelAlpha.setInterpolator(new LogDecelerateInterpolator(100, 0)); panelAlpha.setInterpolator(material ? decelerateInterpolator :
new AccelerateInterpolator(1.5f));
mStateAnimation.play(panelAlpha); mStateAnimation.play(panelAlpha);
} }
@ -3503,15 +3531,16 @@ public class Launcher extends Activity
ObjectAnimator pageDrift = LauncherAnimUtils.ofFloat(page, "translationY", ObjectAnimator pageDrift = LauncherAnimUtils.ofFloat(page, "translationY",
0, yDrift); 0, yDrift);
page.setTranslationY(0);
pageDrift.setDuration(revealDuration - SINGLE_FRAME_DELAY); pageDrift.setDuration(revealDuration - SINGLE_FRAME_DELAY);
pageDrift.setInterpolator(new LogDecelerateInterpolator(100, 0)); pageDrift.setInterpolator(decelerateInterpolator);
pageDrift.setStartDelay(itemsAlphaStagger + SINGLE_FRAME_DELAY); pageDrift.setStartDelay(itemsAlphaStagger + SINGLE_FRAME_DELAY);
mStateAnimation.play(pageDrift); mStateAnimation.play(pageDrift);
page.setAlpha(1f); page.setAlpha(1f);
ObjectAnimator itemsAlpha = LauncherAnimUtils.ofFloat(page, "alpha", 1f, 0f); ObjectAnimator itemsAlpha = LauncherAnimUtils.ofFloat(page, "alpha", 1f, 0f);
itemsAlpha.setDuration(100); itemsAlpha.setDuration(100);
itemsAlpha.setInterpolator(new LogDecelerateInterpolator(100, 0)); itemsAlpha.setInterpolator(decelerateInterpolator);
mStateAnimation.play(itemsAlpha); mStateAnimation.play(itemsAlpha);
} }
@ -3554,9 +3583,6 @@ public class Launcher extends Activity
dispatchOnLauncherTransitionPrepare(fromView, animated, true); dispatchOnLauncherTransitionPrepare(fromView, animated, true);
dispatchOnLauncherTransitionPrepare(toView, animated, true); dispatchOnLauncherTransitionPrepare(toView, animated, true);
mAppsCustomizeContent.stopScrolling(); mAppsCustomizeContent.stopScrolling();
if (workspaceAnim != null) {
mStateAnimation.play(workspaceAnim);
} }
mStateAnimation.addListener(new AnimatorListenerAdapter() { mStateAnimation.addListener(new AnimatorListenerAdapter() {
@ -3578,9 +3604,26 @@ public class Launcher extends Activity
} }
}); });
dispatchOnLauncherTransitionStart(fromView, animated, true); final AnimatorSet stateAnimation = mStateAnimation;
dispatchOnLauncherTransitionStart(toView, animated, true); final Runnable startAnimRunnable = new Runnable() {
LauncherAnimUtils.startAnimationAfterNextDraw(mStateAnimation, toView); public void run() {
// Check that mStateAnimation hasn't changed while
// we waited for a layout/draw pass
if (mStateAnimation != stateAnimation)
return;
dispatchOnLauncherTransitionStart(fromView, animated, false);
dispatchOnLauncherTransitionStart(toView, animated, false);
if (Utilities.isLmp()) {
for (int i = 0; i < layerViews.size(); i++) {
View v = layerViews.get(i);
if (v != null) v.buildLayer();
}
}
mStateAnimation.start();
}
};
fromView.post(startAnimRunnable);
} else { } else {
fromView.setVisibility(View.GONE); fromView.setVisibility(View.GONE);
dispatchOnLauncherTransitionPrepare(fromView, animated, true); dispatchOnLauncherTransitionPrepare(fromView, animated, true);
@ -3724,25 +3767,6 @@ public class Launcher extends Activity
// TODO // TODO
} }
/**
* Shows the hotseat area.
*/
void showHotseat(boolean animated) {
if (!LauncherAppState.getInstance().isScreenLarge()) {
if (animated) {
if (mHotseat.getAlpha() != 1f) {
int duration = 0;
if (mSearchDropTargetBar != null) {
duration = mSearchDropTargetBar.getTransitionInDuration();
}
mHotseat.animate().alpha(1f).setDuration(duration);
}
} else {
mHotseat.setAlpha(1f);
}
}
}
/** /**
* Hides the hotseat area. * Hides the hotseat area.
*/ */

View File

@ -1212,14 +1212,6 @@ public class Workspace extends SmoothPagedView
enableChildrenCache(mCurrentPage - 1, mCurrentPage + 1); enableChildrenCache(mCurrentPage - 1, mCurrentPage + 1);
} }
} }
// If we are not fading in adjacent screens, we still need to restore the alpha in case the
// user scrolls while we are transitioning (should not affect dispatchDraw optimizations)
if (!mWorkspaceFadeInAdjacentScreens) {
for (int i = 0; i < getChildCount(); ++i) {
((CellLayout) getPageAt(i)).setShortcutAndWidgetAlpha(1f);
}
}
} }
protected void onPageEndMoving() { protected void onPageEndMoving() {
@ -2054,8 +2046,9 @@ public class Workspace extends SmoothPagedView
mNewAlphas = new float[childCount]; mNewAlphas = new float[childCount];
} }
Animator getChangeStateAnimation(final State state, boolean animated) { Animator getChangeStateAnimation(final State state, boolean animated,
return getChangeStateAnimation(state, animated, 0, -1); ArrayList<View> layerViews) {
return getChangeStateAnimation(state, animated, 0, -1, layerViews);
} }
@Override @Override
@ -2191,6 +2184,11 @@ public class Workspace extends SmoothPagedView
private static final int HIDE_WORKSPACE_DURATION = 100; private static final int HIDE_WORKSPACE_DURATION = 100;
Animator getChangeStateAnimation(final State state, boolean animated, int delay, int snapPage) { Animator getChangeStateAnimation(final State state, boolean animated, int delay, int snapPage) {
return getChangeStateAnimation(state, animated, delay, snapPage, null);
}
Animator getChangeStateAnimation(final State state, boolean animated, int delay, int snapPage,
ArrayList<View> layerViews) {
if (mState == state) { if (mState == state) {
return null; return null;
} }
@ -2312,6 +2310,9 @@ public class Workspace extends SmoothPagedView
cl.setBackgroundAlpha(mNewBackgroundAlphas[i]); cl.setBackgroundAlpha(mNewBackgroundAlphas[i]);
cl.setShortcutAndWidgetAlpha(mNewAlphas[i]); cl.setShortcutAndWidgetAlpha(mNewAlphas[i]);
} else { } else {
if (layerViews != null) {
layerViews.add(cl);
}
if (mOldAlphas[i] != mNewAlphas[i] || currentAlpha != mNewAlphas[i]) { if (mOldAlphas[i] != mNewAlphas[i] || currentAlpha != mNewAlphas[i]) {
LauncherViewPropertyAnimator alphaAnim = LauncherViewPropertyAnimator alphaAnim =
new LauncherViewPropertyAnimator(cl.getShortcutsAndWidgets()); new LauncherViewPropertyAnimator(cl.getShortcutsAndWidgets());
@ -2359,6 +2360,17 @@ public class Workspace extends SmoothPagedView
.alpha(finalOverviewPanelAlpha).withLayer(); .alpha(finalOverviewPanelAlpha).withLayer();
overviewPanelAlpha.addListener(new AlphaUpdateListener(overviewPanel)); overviewPanelAlpha.addListener(new AlphaUpdateListener(overviewPanel));
// For animation optimations, we may need to provide the Launcher transition
// with a set of views on which to force build layers in certain scenarios.
hotseat.setLayerType(View.LAYER_TYPE_HARDWARE, null);
searchBar.setLayerType(View.LAYER_TYPE_HARDWARE, null);
overviewPanel.setLayerType(View.LAYER_TYPE_HARDWARE, null);
if (layerViews != null) {
layerViews.add(hotseat);
layerViews.add(searchBar);
layerViews.add(overviewPanel);
}
if (workspaceToOverview) { if (workspaceToOverview) {
pageIndicatorAlpha.setInterpolator(new DecelerateInterpolator(2)); pageIndicatorAlpha.setInterpolator(new DecelerateInterpolator(2));
hotseatAlpha.setInterpolator(new DecelerateInterpolator(2)); hotseatAlpha.setInterpolator(new DecelerateInterpolator(2));
@ -2504,21 +2516,6 @@ public class Workspace extends SmoothPagedView
private void onTransitionEnd() { private void onTransitionEnd() {
mIsSwitchingState = false; mIsSwitchingState = false;
updateChildrenLayersEnabled(false); updateChildrenLayersEnabled(false);
// The code in getChangeStateAnimation to determine initialAlpha and finalAlpha will ensure
// ensure that only the current page is visible during (and subsequently, after) the
// transition animation. If fade adjacent pages is disabled, then re-enable the page
// visibility after the transition animation.
if (!mWorkspaceFadeInAdjacentScreens) {
for (int i = 0; i < getChildCount(); i++) {
final CellLayout cl = (CellLayout) getChildAt(i);
cl.setShortcutAndWidgetAlpha(1f);
}
} else {
for (int i = 0; i < numCustomPages(); i++) {
final CellLayout cl = (CellLayout) getChildAt(i);
cl.setShortcutAndWidgetAlpha(1f);
}
}
showCustomContentIfNecessary(); showCustomContentIfNecessary();
} }