Fix bug 3345948 - ActionBar.show()/hide() shouldn't animate if called

before first layout

Enable/disable the action bar show/hide animation as part of the
activity/dialog lifecycle. This allows apps to set action bar
visibility state as the activity first becomes visible or returns to
visibility without the associated animation.

Change-Id: I85ff9268d2cb2c8fcd3364dd275597fe90529224
This commit is contained in:
Adam Powell
2011-02-08 16:20:15 -08:00
parent 2157f045d3
commit 50efbed668
3 changed files with 52 additions and 22 deletions

View File

@@ -1067,6 +1067,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;
}
@@ -1319,6 +1320,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() {