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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user