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

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

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

【问题讨论】:

  • 一个绝妙的,不,绝妙的问题!

标签: android graphics path fill


【解决方案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 非常正确。我保持代码简单以演示如何使用着色器。
猜你喜欢
  • 2011-11-12
  • 2018-11-08
  • 2022-01-19
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 2017-05-17
  • 2019-11-03
相关资源
最近更新 更多