Android Lollipop上的渐变状态栏

前端之家收集整理的这篇文章主要介绍了Android Lollipop上的渐变状态栏前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想做这样的事情

适用于Android 5.0及更高版本?

我该如何实现?我无法在StackOverFlow或Android开发人员网站上找到任何解决方案.

我建议我可以使状态栏透明,并在状态栏下绘制渐变.但是有很少的问题.

第一个问题是,形状可绘制的通常梯度不支持材料设计规范http://www.google.com/design/spec/style/imagery.html

第二个问题是,我无法通过android适合映射片段到windows:fitsSystemWindows =“true”.

解决方法

给出与材料设计现场所示大致相同的公式的公式为:
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,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建议不要在绘图方法中创建新对象,但它比通过画布逐行绘制更有效.

您可以查看demo project中的几种方法的比较

猜你在找的Android相关文章