如何用线性渐变填充Android中的路径?

Posted

技术标签:

【中文标题】如何用线性渐变填充Android中的路径?【英文标题】:How to fill a Path in Android with a linear gradient? 【发布时间】:2011-02-19 15:15:08 【问题描述】:

给定一个封闭的Path对象结果是这样的:

虽然这是一个矩形,但我正在寻找适用于任何封闭路径的东西。

【问题讨论】:

一个绝妙的,不,绝妙的问题! 【参考方案1】:

虽然 steelbytes 的回答可能会让您更好地控制渐变的各个部分,但您可以在没有路径的情况下做到这一点:

Paint m_Paint = new Paint();
protected void onDraw(Canvas canvas)

    super.onDraw(canvas);
    // start at 0,0 and go to 0,max to use a vertical
    // gradient the full height of the screen.
    m_Paint.setShader(new LinearGradient(0, 0, 0, getHeight(), Color.BLACK, Color.WHITE, Shader.TileMode.MIRROR));
    canvas.drawPaint(m_Paint);

【讨论】:

好的,但永远不要在 onDraw(...) 方法中构造 Paint 实例 @ebtokyo:出于性能原因?你会在创建时缓存它并在每个 onDraw 上更新它的大小(或者可能在调整大小时)? 是的,出于性能原因。在 onDraw() 中进行 Lint cmets 分配,如下所示:“在绘制/布局操作期间避免对象分配(改为预分配和重用)” @ebtokyo:LinearGradient 实例也应该在视图 lifycle 的另一个阶段进行实例化 @TalKanel 你不能修改LinearGradient,所以你必须重新实例化它。也许不在onDraw,但在onLayoutonMeasure。但无论如何你都会收到一个 lint 警告。【参考方案2】:

这可能会有所帮助。

注意:在每次调用 onDraw 时创建 Paint 等效率不高。这只是一个线性渐变着色器的演示

protected void onDraw(Canvas canvas)

    super.onDraw(canvas);
    int w = getWidth();
    int h = getHeight();
    Paint p = new Paint(Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
    Path pth = new Path();
    pth.moveTo(w*0.27f,0);
    pth.lineTo(w*0.73f,0);
    pth.lineTo(w*0.92f,h);
    pth.lineTo(w*0.08f,h);
    pth.lineTo(w*0.27f,0);
    p.setColor(0xff800000);
    p.setShader(new LinearGradient(0,0,0,h,0xff000000,0xffffffff,Shader.TileMode.CLAMP));
    canvas.drawPath(pth,p);
   

【讨论】:

在方法 onDraw(Canvas canvas) 中创建对象(Paint、Path、...)的坏主意 @igo 非常正确。我保持代码简单以演示如何使用着色器。

以上是关于如何用线性渐变填充Android中的路径?的主要内容,如果未能解决你的问题,请参考以下文章

如何用渐变色填充部分背景?

如何给SVG填充和描边应用线性渐变

如何给我的 SVG 图标冠上金色的线性渐变填充(路径)颜色? [复制]

如何用渐变颜色的控制点填充贝塞尔路径

在 SwiftUI 中沿路径填充颜色渐变

React.js - 使用 svg 线性渐变不起作用