2015-01-13 17 views
8

Piszę prostą aplikację, która implementuje materiał projektowania zgodnego nav szufladę w sposób opisany w niniejszym poście stosu: https://stackoverflow.com/a/27153313/1621380Animacja Pasek stanu Kolor na DrawerLayout - Materiał Projekt

ScrimInsetsFrameLayout działa świetnie i wszystko jest dandys dopóki nie próbują aby programowo zmienić kolor paska stanu. Moja aplikacja wykorzystuje interfejs API Palette do dynamicznej zmiany paska narzędzi i paska stanu.

Używam property animation api do animowania paska narzędzi i działa świetnie! ale staram się zrobić tę samą animację na pasku stanu i wydaje się, że nie chce ona animować. Oto przykład

oh no statusbar!

Oto kod dla mojego animator:

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(); 
    } 
} 

Uwaga: Ten sam kod jest blaknięcie pasek, więc jej udowodnione do pracy.

Moje pytanie brzmi; czy ktoś wie, w jaki sposób uzyskać płynne przejście przy użyciu DrawerLayout.setStatusBarBackgorundColour()?

. Uwaga: Użyłem metody Okno window.setStatusBarColor() metody i animuje w porządku, ale łamie „przezroczysty pasek stanu”, gdy NavDrawer jest ciągnięty w

+2

Uwaga istnieje również metoda pomocnika [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) oblicza górną część i rysuje tło paska stanu. Musisz tylko wywołać 'View.invalidate', aby wymusić odświeżenie podczas aktualizacji animacji. – adneal

+1

@adneal To było wspaniałe i działało jak czar! Dziękujemy – Spittal

Odpowiedz

3

Jak poinformowała @ komentarzu adneal w sprawie mojego pierwotnego pytania odpowiedź była unieważnij widok podczas animacji.

DrawerLayout oblicza górną część i rysuje tło paska stanu. Tak więc wystarczy wywołać View.invalidate, aby wymusić odświeżenie podczas aktualizacji animacji. @adneal

zaktualizowałem mój kod do tego

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(); 

Dla zastanawiać, dlaczego ten ktoś pracował, znalazłem tego stosu słupek pouczające: When it's necessary to execute invalidate() on a View?

1

można to łatwo zrobić jak poniżej:


1 - ustaw kolor na pasku stanu na przezroczyste za pomocą tego:

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

2 - określenie widoku aplikacji, aby zmienić go w tle:

View root = *A_view_on_the_activity*.getRootView(); 

3 - następnie dodać tę funkcję do projektu:

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 - a następnie zmienić kolor aplikacji dziury w tle animacja za pomocą funkcji opisanej powyżej:

color_change(root, from_color, to_color); 
Powiązane problemy