Material Design 中呈现的 Android Lollipop 上的半透明渐变状态栏

Posted

技术标签:

【中文标题】Material Design 中呈现的 Android Lollipop 上的半透明渐变状态栏【英文标题】:Translucent gradient status bar on Android Lollipop presented in Material Design 【发布时间】:2016-01-11 01:33:50 【问题描述】:

我想做这样的东西

适用于 android 5.0 及更高版本?

我该如何实现呢?我在 *** 或 android 开发者网站上找不到任何解决方案。

我建议我可以使状态栏透明并在状态栏下绘制渐变绘制。但问题很少。

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

第二个问题是我无法通过android:fitsSystemWindows="true" 将地图片段放入窗口。

【问题讨论】:

如果您否定我的问题,请描述在 *** 中发布的任何解决方案,或在 cmets 中描述我的问题中的问题。 使用 9-patch 绘制渐变不是问题 你能告诉我们你已经尝试过什么(代码),你得到了什么以及你期望得到什么? 有任何解决方案吗?卡在同样的问题上,并没有找到任何方法来做到这一点。 您只是希望渐变位于工具栏/操作栏的顶部还是应该向下延伸更远? 【参考方案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 逐行绘制更快。

你可以在demo project看几种方式的比较

【讨论】:

以上是关于Material Design 中呈现的 Android Lollipop 上的半透明渐变状态栏的主要内容,如果未能解决你的问题,请参考以下文章

Material Design学习之 ProgreesBar

Material Design学习之 Dialog(顺便把前两天AppBarLayout没讲的部分提一提)

React Material Design:在类组件中使用带有 redux 的 React Material Design 自定义样式

Material Design

Android Material Design-Creating Apps with Material Design(用 Material Design设计App)-(零)

Design Support Library(支撑Material Design)