Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Changing the ActionBar hide animation?

Tags:

By default in Android 3.0+, when ActionBar.hide()/show() are called the bar is animated with a brief fade in/out animation.

There does not seem to be an XML style attribute in this list associated with an animation resource.

Is there some way to change this animation? In my case, I simply want to change the animation time, but is it also possible to have a sliding animation?

like image 378
blork Avatar asked Aug 05 '11 08:08

blork


People also ask

How to Hide ActionBar android studio?

xml. If you want to hide Action Bar from the entire application (from all Activities and fragments), then you can use this method. Just go to res -> values -> styles. xml and change the base application to “Theme.

How to remove default appbar in android?

NoTitleBar in application is remove all the page theme effects. If you want to remove the action on First screen add the android:theme="@android:style/Theme. NoTitleBar". Save the theme for remaining pages.


2 Answers

No.

At least not in 3.0, 3.1, or 3.2. If you look at the decompiled sources of com.android.internal.app.ActionBarImpl you'll find that the animations are hard-coded.

E.g., from 3.2:

.method public hide()V     .locals 8      .prologue     const/4 v5, 0x0      const/4 v7, 0x0      const/4 v6, 0x1      .line 529     iget-object v2, p0, Lcom/android/internal/app/ActionBarImpl;->mCurrentAnim:Landroid/animation/Animator;      if-eqz v2, :cond_0      .line 530     iget-object v2, p0, Lcom/android/internal/app/ActionBarImpl;->mCurrentAnim:Landroid/animation/Animator;      invoke-virtual {v2}, Landroid/animation/Animator;->end()V      .line 532     :cond_0     iget-object v2, p0, Lcom/android/internal/app/ActionBarImpl;->mContainerView:Lcom/android/internal/widget/ActionBarContainer;      invoke-virtual {v2}, Lcom/android/internal/widget/ActionBarContainer;->getVisibility()I      move-result v2      const/16 v3, 0x8      if-ne v2, v3, :cond_1      .line 553     :goto_0     return-void      .line 536     :cond_1     iget-boolean v2, p0, Lcom/android/internal/app/ActionBarImpl;->mShowHideAnimationEnabled:Z      if-eqz v2, :cond_3      .line 537     iget-object v2, p0, Lcom/android/internal/app/ActionBarImpl;->mContainerView:Lcom/android/internal/widget/ActionBarContainer;      const/high16 v3, 0x3f80      invoke-virtual {v2, v3}, Lcom/android/internal/widget/ActionBarContainer;->setAlpha(F)V      .line 538     iget-object v2, p0, Lcom/android/internal/app/ActionBarImpl;->mContainerView:Lcom/android/internal/widget/ActionBarContainer;      invoke-virtual {v2, v6}, Lcom/android/internal/widget/ActionBarContainer;->setTransitioning(Z)V      .line 539     new-instance v0, Landroid/animation/AnimatorSet;      invoke-direct {v0}, Landroid/animation/AnimatorSet;-><init>()V      .line 540     .local v0, anim:Landroid/animation/AnimatorSet;     iget-object v2, p0, Lcom/android/internal/app/ActionBarImpl;->mContainerView:Lcom/android/internal/widget/ActionBarContainer;      const-string v3, "alpha"      new-array v4, v6, [F      aput v5, v4, v7      invoke-static {v2, v3, v4}, Landroid/animation/ObjectAnimator;->ofFloat(Ljava/lang/Object;Ljava/lang/String;[F)Landroid/animation/ObjectAnimator;      move-result-object v2      invoke-virtual {v0, v2}, Landroid/animation/AnimatorSet;->play(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;      move-result-object v1      .line 541     .local v1, b:Landroid/animation/AnimatorSet$Builder;     iget-object v2, p0, Lcom/android/internal/app/ActionBarImpl;->mContentView:Landroid/view/View;      if-eqz v2, :cond_2      .line 542     iget-object v2, p0, Lcom/android/internal/app/ActionBarImpl;->mContentView:Landroid/view/View;      const-string/jumbo v3, "translationY"      const/4 v4, 0x2      new-array v4, v4, [F      aput v5, v4, v7      iget-object v5, p0, Lcom/android/internal/app/ActionBarImpl;->mContainerView:Lcom/android/internal/widget/ActionBarContainer;      invoke-virtual {v5}, Lcom/android/internal/widget/ActionBarContainer;->getHeight()I      move-result v5      neg-int v5, v5      int-to-float v5, v5      aput v5, v4, v6      invoke-static {v2, v3, v4}, Landroid/animation/ObjectAnimator;->ofFloat(Ljava/lang/Object;Ljava/lang/String;[F)Landroid/animation/ObjectAnimator;      move-result-object v2      invoke-virtual {v1, v2}, Landroid/animation/AnimatorSet$Builder;->with(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;      .line 544     iget-object v2, p0, Lcom/android/internal/app/ActionBarImpl;->mContainerView:Lcom/android/internal/widget/ActionBarContainer;      const-string/jumbo v3, "translationY"      new-array v4, v6, [F      iget-object v5, p0, Lcom/android/internal/app/ActionBarImpl;->mContainerView:Lcom/android/internal/widget/ActionBarContainer;      invoke-virtual {v5}, Lcom/android/internal/widget/ActionBarContainer;->getHeight()I      move-result v5      neg-int v5, v5      int-to-float v5, v5      aput v5, v4, v7      invoke-static {v2, v3, v4}, Landroid/animation/ObjectAnimator;->ofFloat(Ljava/lang/Object;Ljava/lang/String;[F)Landroid/animation/ObjectAnimator;      move-result-object v2      invoke-virtual {v1, v2}, Landroid/animation/AnimatorSet$Builder;->with(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;      .line 547     :cond_2     iget-object v2, p0, Lcom/android/internal/app/ActionBarImpl;->mHideListener:Landroid/animation/Animator$AnimatorListener;      invoke-virtual {v0, v2}, Landroid/animation/AnimatorSet;->addListener(Landroid/animation/Animator$AnimatorListener;)V      .line 548     iput-object v0, p0, Lcom/android/internal/app/ActionBarImpl;->mCurrentAnim:Landroid/animation/Animator;      .line 549     invoke-virtual {v0}, Landroid/animation/AnimatorSet;->start()V      goto :goto_0      .line 551     .end local v0           #anim:Landroid/animation/AnimatorSet;     .end local v1           #b:Landroid/animation/AnimatorSet$Builder;     :cond_3     iget-object v2, p0, Lcom/android/internal/app/ActionBarImpl;->mHideListener:Landroid/animation/Animator$AnimatorListener;      const/4 v3, 0x0      invoke-interface {v2, v3}, Landroid/animation/Animator$AnimatorListener;->onAnimationEnd(Landroid/animation/Animator;)V      goto :goto_0 .end method 

UPDATE

Same goes for ICS and JellyBean

like image 139
Jake Wharton Avatar answered Nov 09 '22 07:11

Jake Wharton


A hack for disabling the ActionBar animation (found by inspecting the source code) can be done through introspection via:

try {   getActionBar().getClass().getDeclaredMethod("setShowHideAnimationEnabled", boolean.class).invoke(getActionBar(), false); } catch (Exception exception) {   // Too bad, the animation will be run ;( } 

Ugly, of course, but this actually work, at least from Android v4.2.

like image 21
Édouard Mercier Avatar answered Nov 09 '22 07:11

Édouard Mercier