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

如何在Android中用线性渐变填充路径?,android,graphics,path,fill,Android,Graphics,Path,Fill,给定闭合路径对象,结果如下所示: 虽然这是一个矩形,但我正在寻找一种适用于任何闭合路径的方法。这可能会有所帮助 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); Pa

给定闭合路径对象,结果如下所示:

虽然这是一个矩形,但我正在寻找一种适用于任何闭合路径的方法。

这可能会有所帮助

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);
}   

虽然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实例methods@ebtokyo:出于性能原因?您是否会在创建时缓存它,并在每个onDraw上更新其大小(或者在resize中)?是的,出于性能原因。Lint对onDraw()中的分配进行如下注释:“在绘制/布局操作期间避免对象分配(而是预分配和重用)”@ebtokyo:还应在视图的另一个阶段中对LinearGradient实例进行pr实例化lifycle@TalKanel无法修改
LinearGradient
,因此必须重新实例化它。可能不是在
onDraw
中,而是在
onLayout
onMeasure
中。但无论如何,你会得到一个警告。一个聪明的,不,一个奇妙的问题!