如何用线性渐变填充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
,但在onLayout
或onMeasure
。但无论如何你都会收到一个 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中的路径?的主要内容,如果未能解决你的问题,请参考以下文章