我想做这样的事情
适用于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中的几种方法的比较