2011-02-26 197 views
3

我有一个LinearGradient的代码,它看起来与其他所有示例相同。Android 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使用相对于最顶层视图的绝对位置(即对话)。我不能为我的生活弄清楚 - 为什么?

谢谢!

罗布

+0

我已经放弃了这个,现在使用ninepatch图形(它有一个渐变)。我的图形是白色的,所以我还借用了一些代码来做一个“着色”过滤器,它给了我色彩控制。 我发现所有渐变(径向和我忘记的)以相同的方式表现,我可以看到没有活动/布局不可知的方式来使它们工作。即使检索和使用屏幕上的位置也没有帮助 - 在一个配置上工作得很好,但在其他配置上工作得很好。 – 2011-02-26 22:29:57

回答

7

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

因此,您需要在画布上总是围绕原图绘制图形,并将画布转换为所需的位置。

例如:

请勿:

canvas.drawCircle(posx, posy, radius); 

DO:

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

希望它帮助! ;)

+0

谢谢你。我会找到有问题的代码并检查修复,然后接受你的答案,但要警告它可能不会立即! – 2012-06-18 19:24:05

+0

这可行。非常感谢! – l33t 2013-06-19 09:04:59

+0

有点不直观,我们必须移动整个画布才能在某个地方绘制渐变,但是一旦您知道它是如何工作的,它就够简单了。 – 2015-02-25 10:13:53

0

在Android清单文件,选择要使用的活动,并利用它确定configChanges属性已定向打勾

+0

没有这样的运气我害怕 - 我试图无济于事,但是这也意味着它是一个通用的View组件,不应该在使用活动上强制进行这样的更改。出于同样的原因,我也打折了任何布局更改。 – 2011-02-26 08:09:31