2015-01-13 17 views
8

Ich bin eine einfache Anwendung zu schreiben, die ein Material Design-konforme nav Schublade implementiert wie dieser Stapel Post beschrieben: https://stackoverflow.com/a/27153313/1621380Animate Statusleiste Farbe auf DrawerLayout - Material Design

Die ScrimInsetsFrameLayout funktioniert super und alles ist prima, bis ich versuche, programmgesteuert die Farbe der Statusleiste ändern. Meine App verwendet die Paletten-API, um die Farbe der Symbolleiste und der Statusleiste dynamisch zu ändern.

Ich verwende die property animation api die Symbolleiste zu animieren und es funktioniert super! aber ich versuche, die gleiche Animation auf der Statusbar zu tun und es scheint nicht animieren zu wollen. Hier ist ein Beispiel

oh no statusbar!

Hier ist der Code für meine Animation:

public static void fadeStatusBar(final DrawerLayout layout, Integer from, Integer to) { 
    if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), from, to); 
     colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 

      @Override 
      public void onAnimationUpdate(ValueAnimator animator) { 
       layout.setStatusBarBackgroundColor((Integer) animator.getAnimatedValue()); 
      } 

     }); 
     colorAnimation.start(); 
    } 
} 

Hinweis: Die gleiche Code, um die Symbolleiste schwindet, so dass sie bewiesen zu arbeiten.

Meine Frage ist; kennt jemand eine Möglichkeit, um einen reibungslosen Übergang zu erhalten, wenn DrawerLayout.setStatusBarBackgorundColour() mit?

. Hinweis: Ich habe die Fenster Methode window.setStatusBarColor() Methode verwendet, und es belebt in Ordnung, aber bricht die „transparent statusbar“, wenn die NavDrawer in Mitleidenschaft gezogen wird

+2

Hinweis gibt es auch die Helfer-Methode [ValueAnimator.ofArgb()] (http://developer.android.com/reference/android/animation/ValueAnimator.html#ofArgb (int ...)) – ianhanniballake

+1

[DrawerLayout] (https: //github.com/android/platform_frameworks_support/blob/lollipop-release/v4/java/android/support/v4/widget/DrawerLayout.java # L1019) berechnet den oberen Einschub und zeichnet den Hintergrund der Statusleiste selbst. Sie müssen also nur "View.invalidate" aufrufen, um das Neuzeichnen zu erzwingen, während die Animation aktualisiert wird. – adneal

+1

@adneal Das ist wunderbar und funktionierte wie ein Charme! Danke – Spittal

Antwort

3

Wie @ adneal Kommentar auf meiner ursprünglichen Frage geraten war die Antwort auf Die Ansicht während der Animation ungültig machen.

DrawerLayout berechnet den oberen Versatz und zieht die Statusleiste Hintergrund selbst. So müssen Sie nur einen Anruf zu View.invalidate machen, um es zu zwingen neu zu zeichnen, während die Animation aktualisiert wird. @adneal

ich meinen Code zu diesem

ValueAnimator colorAnimation = ValueAnimator.ofArgb(from, to); 
colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 

    @Override 
    public void onAnimationUpdate(ValueAnimator animator) { 
     layout.invalidate(); 
     layout.setStatusBarBackgroundColor((Integer) animator.getAnimatedValue()); 
    } 

}); 
colorAnimation.start(); 

Für alle fragen, aktualisiert haben, warum dies funktioniert, fand ich diesen Stapel Post erhellend: When it's necessary to execute invalidate() on a View?

1

Sie dies leicht wie unten tun können:


1 - stellen Sie Ihre statusbar Farbe transparent durch diese Verwendung:

<item name="colorPrimaryDark">@android:color/transparent</item> 

2 - Anwendung Sicht definieren sie den Hintergrund zu ändern:

View root = *A_view_on_the_activity*.getRootView(); 

3 - dann diese Funktion zu Ihrem Projekt hinzufügen:

private void color_change(final View view,int from_color,int to_color){ 
    final float[] from = new float[3], 
        to = new float[3]; 

    String hexColor_from = String.format("#%06X", (0xFFFFFF & from_color)); 
    String hexColor_to = String.format("#%06X", (0xFFFFFF & to_color)); 

    Color.colorToHSV(Color.parseColor(hexColor_from), from); // from 
    Color.colorToHSV(Color.parseColor(hexColor_to), to);  // to 

    ValueAnimator anim = ValueAnimator.ofFloat(0, 1); // animate from 0 to 1 
    anim.setDuration(600);        // for 300 ms 

    final float[] hsv = new float[3];     // transition color 
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){ 
     @Override public void onAnimationUpdate(ValueAnimator animation) { 
      // Transition along each axis of HSV (hue, saturation, value) 
      hsv[0] = from[0] + (to[0] - from[0])*animation.getAnimatedFraction(); 
      hsv[1] = from[1] + (to[1] - from[1])*animation.getAnimatedFraction(); 
      hsv[2] = from[2] + (to[2] - from[2])*animation.getAnimatedFraction(); 

      view.setBackgroundColor(Color.HSVToColor(hsv)); 
     } 
    }); 

    anim.start(); 
} 

4 - und dann das Loch der Anwendung Hintergrundfarbe ändern Animation mit der oben beschriebenen Funktion:

color_change(root, from_color, to_color);