2015-10-13 10 views
11

vorrei fare qualcosa di simile Gradient status barbarra di stato di pendenza su Android Lollipop

per Android 5.0 e superiori?

Come posso implementarlo? Non riesco a trovare alcuna soluzione su StackOverFlow o sul sito degli sviluppatori Android.

Ho suggerito che è possibile rendere la barra di stato trasparente e disegnare il gradiente disegnabile sotto la barra di stato. Ma ci sono pochi problemi.

primo problema è che al solito gradiente da forma drawable non supporta Material design spec http://www.google.com/design/spec/style/imagery.htmlMaterial Design gradient

secondo problema è che non posso in forma mappa frammento di Windows tramite android:fitsSystemWindows="true".

+0

Se si nega la mia domanda, per favore, descrivere qualsiasi soluzione, che sono state inviate in StackOverflow o descrivere qual è il problema nella mia interrogazione nei commenti. –

+0

Il gradiente di disegno non è un problema se userai 9 patch –

+0

Potresti mostrarci cosa hai già provato (codice), cosa ottieni e cosa avresti dovuto ottenere? – TobiMarg

risposta

0

formula che dà circa stessa trama, come indicato sul sito di Material Design è:

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

Ho provato diversi modi per disegnare gradiente iperboloide tramite Canvas e trovato la soluzione più veloce.

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

So che Google consiglia di non creare nuovi oggetti in draw metodo, ma funziona più veloce di disegno riga per riga attraverso Canvas.

Potete guardare il confronto dei diversi modi in demo project

Problemi correlati