2015-10-13 24 views
11

chciałbym zrobić coś takiego Gradient status barGradient pasek stanu na Androida Lollipop

dla Android 5.0 i wyżej?

Jak mogę to wdrożyć? Nie mogę znaleźć żadnego rozwiązania na StackOverFlow lub na stronie dla programistów Androida.

Zasugerowałem, że mogę uczynić pasek stanu przezroczystym i narysować gradient do rysowania pod paskiem stanu. Ale jest kilka problemów.

Pierwszym problemem jest to, że zwykle gradient od kształtu rozciągliwej nie obsługuje projektowania materiałów specyfikację http://www.google.com/design/spec/style/imagery.htmlMaterial Design gradient

Drugim problemem jest to, że mogę nie pasuje do map fragment okna poprzez android:fitsSystemWindows="true".

+0

Jeśli neguje pan na moje pytanie, proszę opisać wszelkie rozwiązania, które zostały zamieszczone w StackOverflow lub opisać czym jest problem w moim pytaniu w komentarzach. –

+0

Gradient rysunku nie stanowi problemu, jeśli użyjesz 9-łaty –

+0

Czy możesz pokazać nam, co już wypróbowałeś (kod), co otrzymałeś i czego oczekiwałeś? – TobiMarg

Odpowiedz

0

formuła, która daje w przybliżeniu tę samą działkę, jak pokazano na stronie Materialnej Design jest:

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

Próbowałem kilka sposobów rysowania hiperboloidę gradientu poprzez płótnie i znaleźć najszybszą rozwiązanie.

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

Wiem, że Google zaleca się nie tworzyć nowe obiekty w draw metody, ale działa szybciej niż rysunek linia po linii przez Canvas.

Możesz zajrzeć na porównaniu kilku sposobów demo project

Powiązane problemy