2015-10-13 15 views
11

würde Ich mag so etwas wie diese Gradient status barGradient Statusleiste auf Android Lollipop

für Android 5.0 und höher machen?

Wie kann ich das umsetzen? Ich kann keine Lösung auf StackOverFlow oder auf der Android-Entwickler-Website finden.

Ich schlug vor, dass ich Statusleiste transparent machen und Gradienten unter Statusleiste zeichnen kann. Aber es gibt wenige Probleme.

Das erste Problem ist, dass übliche Gradienten von Form ziehbar nicht Material Design-Spezifikation unterstützt http://www.google.com/design/spec/style/imagery.htmlMaterial Design gradient

Zweites Problem ist, dass ich nicht fit Fragment der Karte Fenster über android:fitsSystemWindows="true".

+0

Wenn Sie meine Frage verneinen, bitte beschreiben jede Lösung, die in Stackoverflow gebucht wurde oder beschreiben, was das Problem in den Kommentaren in meiner Frage. –

+0

Zeichnungsgradient ist kein Problem, wenn Sie 9-Patch verwenden –

+0

Könnten Sie uns zeigen, was Sie bereits versucht haben (Code), was Sie bekommen und was Sie erwartet hatten? – TobiMarg

Antwort

0

Formel, die in etwa gleiches Grundstück gibt, wie auf der Website von Material Design gezeigt ist:

y = 3/(4*(x+0.5)) - 0.5 

ich mehr Möglichkeiten habe versucht hyperboloid Gradienten über Leinwand zu zeichnen und fand die schnellste Lösung.

public class HyperbolaGradientDrawable extends Drawable { 

private static final int ALPHA_DEFAULT = (int) (0.6f * 255); 

private int mAlpha = ALPHA_DEFAULT; 
private int mColor; 
private Rect mBmpRect = new Rect(); 
private int[] mColors = new int[0]; 
private Bitmap mBmp; 

@Override 
public void draw(Canvas canvas) { 
    Rect bounds = getBounds(); 
    if (mColors.length != bounds.height()) { 
     int alpha; 
     float y, alphaRelative; 
     mColors = new int[bounds.height()]; 
     for (int i = 0; i < bounds.height(); i++) { 
      y = ((float) i)/bounds.height(); 
      // this function gives approximately 0.5 of the bearing alpha at 3/10ths closed to the darker end 
      alphaRelative = 3/(4 * (y + 0.5f)) - 0.5f; 
      alpha = (int) (alphaRelative * mAlpha); 
      mColors[i] = alpha << 24 | mColor; 
     } 
     mBmp = Bitmap.createBitmap(mColors, 1, bounds.height(), Bitmap.Config.ARGB_8888); 
     mBmpRect.set(0, 0, 1, bounds.height()); 
    } 
    canvas.drawBitmap(mBmp, mBmpRect, bounds, null); 
} 

public void setColor(int color) { 
    // remove alpha chanel 
    mColor = color & 0x00FFFFFF; 
} 

@Override 
public void setAlpha(int alpha) { 
    mAlpha = alpha; 
} 

@Override 
public void setColorFilter(ColorFilter colorFilter) { 

} 

@Override 
public int getOpacity() { 
    return PixelFormat.TRANSLUCENT; 
} 
} 

Ich weiß, dass Google empfehlen keine neuen Objekte in draw Methode erstellen zu tun, aber es funktioniert schneller als durch die Linie durch Canvas Zeichnung Linie.

Sie im Vergleich von mehreren Möglichkeiten in demo project aussehen können

Verwandte Themen