【问题标题】:Android LinearGradient and weird relative positioningAndroid LinearGradient 和奇怪的相对定位
【发布时间】:2011-02-26 00:58:48
【问题描述】:

我有以下带有 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);

}
}

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

但是,当其他事情改变我视图的Y位置时,它就出错了:

LinearGradient 使用相对于最顶层视图(即对话框)的绝对位置。我一辈子都想不通 - 为什么?

谢谢!

罗伯

【问题讨论】:

  • 我已经放弃了,现在使用 Ninepatch 图形(有渐变)。我的图形是白色的,所以我还借用了一些代码来做一个“着色”过滤器,它可以让我控制颜色。我发现所有渐变(径向渐变和我忘记的渐变)都以相同的方式表现,并且我看不到任何活动/布局不可知的方式来使它们起作用。即使检索和使用屏幕上的位置也无济于事 - 在一种配置上运行良好,但在其他配置上运行良好。

标签: android layout gradient


【解决方案1】:

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

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

例如:

不要:

canvas.drawCircle(posx, posy, radius);

做:

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

希望对您有所帮助! ;)

【讨论】:

  • 谢谢你。我会找到有问题的代码并查看修复程序,然后接受您的回答,但请注意可能不会立即回复!
  • 有点不直观,我们必须移动整个画布才能在某处绘制渐变,但是一旦你知道它是如何工作的,它就足够简单了。
【解决方案2】:

在 android 清单文件中,选择您正在使用的活动,并确保它的 configChanges 属性已勾选方向

【讨论】:

  • 恐怕没有这样的运气 - 我尝试了无济于事,但这也是一个通用的视图组件,不应该在使用活动上强制进行此类更改。出于同样的原因,我也忽略了任何布局更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 2010-10-28
  • 1970-01-01
  • 2021-11-04
  • 2016-12-29
  • 2013-07-01
  • 1970-01-01
相关资源
最近更新 更多