Подтвердить что ты не робот

Строка состояния Gradient на Android Lollipop

Я хотел бы сделать что-то вроде этого Строка состояния градиента

для Android 5.0 и выше?

Как я могу это реализовать? Я не могу найти решение на StackOverFlow или на сайте разработчика Android.

Я предположил, что я могу сделать панель состояния прозрачной и рисовать градиент, подбираемый под панелью состояния. Но проблем мало.

Первая проблема заключается в том, что обычный градиент от рисованной формы не поддерживает спецификацию Material Design http://www.google.com/design/spec/style/imagery.html Градиент дизайна материала

Вторая проблема заключается в том, что я не могу поместить фрагмент карты в окна через android:fitsSystemWindows="true".

4b9b3361

Ответ 1

Формула, которая дает примерно такой же график, как показано на сайте Material Design:

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

Я пробовал несколько способов рисовать гиперболоидный градиент через Canvas и нашел самое быстрое решение.

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

Я знаю, что Google рекомендует не создавать новые объекты в методе draw, но работает быстрее, чем рисование по строкам через Canvas.

Вы можете посмотреть сравнение нескольких способов в демонстрационный проект