Android LinearGradient和奇怪的相对定位

时间:2011-02-26 00:58:49

标签: android layout gradient

我有一个LinearGradient的代码,看起来和其他所有例子都差不多。

public class CustomColourBar extends View
{

public CustomColourBar( Context context, AttributeSet attribs )
{
    super( context, attribs );
}    

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
    setMeasuredDimension(170, 40);
}

@Override
protected synchronized void onDraw( Canvas canvas )
{
    int height = this.getMeasuredHeight();
    int width = this.getMeasuredWidth();

    LinearGradient shader = new LinearGradient(
        0, 0, 0, height, 
        Color.RED, Color.YELLOW,
        Shader.TileMode.CLAMP );

    Paint paint = new Paint(); 
    paint.setShader(shader);
    RectF fgRect = new RectF( 0, 0, width, height);

    canvas.drawRoundRect(fgRect, 7f, 7f, paint);

}
}

在布局中,这会生成以下内容,这几乎是正确的:

http://i.stack.imgur.com/Pqbx1.png

然而,当其他事情改变我观点的Y位置时,就会出错:

http://i.stack.imgur.com/bnyeU.png

LinearGradient使用相对于最顶层视图(即对话框)的绝对位置。我不能为我的生活弄清楚 - 为什么?

谢谢!

罗布

2 个答案:

答案 0 :(得分:8)

我遇到了同样的问题。着色器中的位置不是形状,而是画布相对。

因此,您需要在画布上始终围绕原点绘制形状,并将画布转换为所需位置。

例如:

请勿:

canvas.drawCircle(posx, posy, radius);

DO:

canvas.save();
canvas.translate(posx, posy);
canvas.drawCircle(0,0,radius);
canvas.restore();

希望它有所帮助! ;)

答案 1 :(得分:0)

在android清单文件中,选择您正在使用的活动,并确保其中的configChanges属性具有方向标记