Merge "Fix bug 3345948 - ActionBar.show()/hide() shouldn't animate if called before first layout"

This commit is contained in:
Adam Powell
2011-02-08 16:32:54 -08:00
committed by Android (Google) Code Review
3 changed files with 52 additions and 22 deletions

View File

@@ -1073,6 +1073,7 @@ public class Activity extends ContextThemeWrapper
protected void onPostResume() {
final Window win = getWindow();
if (win != null) win.makeActive();
if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(true);
mCalled = true;
}
@@ -1325,6 +1326,7 @@ public class Activity extends ContextThemeWrapper
* @see #onDestroy
*/
protected void onStop() {
if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(false);
mCalled = true;
}

View File

@@ -352,12 +352,14 @@ public class Dialog implements DialogInterface, Window.Callback,
* Called when the dialog is starting.
*/
protected void onStart() {
if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(true);
}
/**
* Called to tell you that you're stopping.
*/
protected void onStop() {
if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(false);
}
private static final String DIALOG_SHOWING_TAG = "android:dialogShowing";

View File

@@ -92,6 +92,7 @@ public class ActionBarImpl extends ActionBar {
final Handler mHandler = new Handler();
private Animator mCurrentAnim;
private boolean mShowHideAnimationEnabled;
private static final TimeInterpolator sFadeOutInterpolator = new DecelerateInterpolator();
@@ -217,6 +218,20 @@ public class ActionBarImpl extends ActionBar {
CONTEXT_DISPLAY_NORMAL : CONTEXT_DISPLAY_SPLIT;
}
/**
* Enables or disables animation between show/hide states.
* If animation is disabled using this method, animations in progress
* will be finished.
*
* @param enabled true to animate, false to not animate.
*/
public void setShowHideAnimationEnabled(boolean enabled) {
mShowHideAnimationEnabled = enabled;
if (!enabled && mCurrentAnim != null) {
mCurrentAnim.end();
}
}
public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
mMenuVisibilityListeners.add(listener);
}
@@ -361,6 +376,7 @@ public class ActionBarImpl extends ActionBar {
mLowerContextView.setVisibility(View.VISIBLE);
}
mActionMode = mode;
show();
return mode;
}
return null;
@@ -487,18 +503,23 @@ public class ActionBarImpl extends ActionBar {
return;
}
mContainerView.setVisibility(View.VISIBLE);
mContainerView.setAlpha(0);
AnimatorSet anim = new AnimatorSet();
AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 1));
if (mContentView != null) {
b.with(ObjectAnimator.ofFloat(mContentView, "translationY",
-mContainerView.getHeight(), 0));
mContainerView.setTranslationY(-mContainerView.getHeight());
b.with(ObjectAnimator.ofFloat(mContainerView, "translationY", 0));
if (mShowHideAnimationEnabled) {
mContainerView.setAlpha(0);
AnimatorSet anim = new AnimatorSet();
AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 1));
if (mContentView != null) {
b.with(ObjectAnimator.ofFloat(mContentView, "translationY",
-mContainerView.getHeight(), 0));
mContainerView.setTranslationY(-mContainerView.getHeight());
b.with(ObjectAnimator.ofFloat(mContainerView, "translationY", 0));
}
anim.addListener(mShowListener);
mCurrentAnim = anim;
anim.start();
} else {
mShowListener.onAnimationEnd(null);
}
anim.addListener(mShowListener);
mCurrentAnim = anim;
anim.start();
}
@Override
@@ -509,18 +530,23 @@ public class ActionBarImpl extends ActionBar {
if (mContainerView.getVisibility() == View.GONE) {
return;
}
mContainerView.setAlpha(1);
AnimatorSet anim = new AnimatorSet();
AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 0));
if (mContentView != null) {
b.with(ObjectAnimator.ofFloat(mContentView, "translationY",
0, -mContainerView.getHeight()));
b.with(ObjectAnimator.ofFloat(mContainerView, "translationY",
-mContainerView.getHeight()));
if (mShowHideAnimationEnabled) {
mContainerView.setAlpha(1);
AnimatorSet anim = new AnimatorSet();
AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 0));
if (mContentView != null) {
b.with(ObjectAnimator.ofFloat(mContentView, "translationY",
0, -mContainerView.getHeight()));
b.with(ObjectAnimator.ofFloat(mContainerView, "translationY",
-mContainerView.getHeight()));
}
anim.addListener(mHideListener);
mCurrentAnim = anim;
anim.start();
} else {
mHideListener.onAnimationEnd(null);
}
anim.addListener(mHideListener);
mCurrentAnim = anim;
anim.start();
}
public boolean isShowing() {