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
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. –
Gradient rysunku nie stanowi problemu, jeśli użyjesz 9-łaty –
Czy możesz pokazać nam, co już wypróbowałeś (kod), co otrzymałeś i czego oczekiwałeś? – TobiMarg