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
fonte
2016-11-08 17:28:19
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. –
Il gradiente di disegno non è un problema se userai 9 patch –
Potresti mostrarci cosa hai già provato (codice), cosa ottieni e cosa avresti dovuto ottenere? – TobiMarg