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
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. –
Zeichnungsgradient ist kein Problem, wenn Sie 9-Patch verwenden –
Könnten Sie uns zeigen, was Sie bereits versucht haben (Code), was Sie bekommen und was Sie erwartet hatten? – TobiMarg