在Android和Java中绘制椭圆之间的差异

时间:2011-08-01 19:46:35

标签: java android path ellipse

在Java中由于某种原因,Ellipse2D.Double使用参数(height, width, x, y),因为当我在Android中创建RectF时参数为(left, top, right, bottom),所以我有点困惑在调整差异。

如果在Java中创建一个Ellipse并使用以下内容:

//Ellipse2D.Double(height, width, x, y)

x = 100;
y = 120;
centerX = getWidth() / 2;
centerY = getHeight() / 2;

//Ellipse2D.Double(100, 120, (centerX - 100) * 2, (centerY - 120) * 2);
new Ellipse2D.Double(x, y, (centerX - x) * 2, (centerY - y) * 2);

这对Android来说是否相同:

//RectF(left, top, right, bottom)

x = 100;
y = 120;
centerX = getWidth() / 2;
centerY = getHeight() / 2;

new RectF((centerX - 100) * 2, (centerY - 120) * 2), 120 - ((centerX - 100) * 2), 100 - ((centerY -120) * 2); 

//canvas.drawOval(myRectF, paint);

我不太确定它们是否相同,我想知道我是否正确计算它?

或者,可以覆盖RectF以使其与Ellipse2D的方式相符吗? IE浏览器。更改参数以使用高度和宽度而不是右下角

2 个答案:

答案 0 :(得分:3)

对于覆盖部分,我不认为它是个好主意,因为RectF不仅用于省略号。

你可以通过你喜欢的方式传递数据来轻松编写一个绘制Oval的方法......

类似的东西:

public RectF myOval(float width, float height, float x, float y){
    float halfW = width/2;
    float halfH = height/2;
    return new RectF(x-halfW, y-halfH, x+halfW, y+halfH);
}

canvas.drawOval(myOval(width, height, x, y), paint);

答案 1 :(得分:2)

为了保持x,y,width,height思维,你可以构造一个实用程序函数来构建一个RectF,其坐标按你想要的顺序排列:

public static RectF buildRectF(double x, double y, double width, double height) {
    // r(l,t,r,b)
    RectF rectf = new RectF(x-width/2, y-height/2, x+width/2, y+height/2);
    return rectf;
}

目前还不清楚您尝试使用的代码示例。 Ellipse2D.Double有4个值:x,y,width和height。 看起来你将宽度设置为(centerX-x)* 2;如果中心位于点(100,120)的右侧,这将确保宽度是距离代码所在组件中心到点(100,120)的距离的两倍。但是,如果你的组件太小,你将分配一个负宽度,这可能很尴尬。

此外,您在RectF示例中使用硬编码值,并将相同参数中的120(y?)和100(x?)组合到RectF,这很可能不是您想要做的。

我建议在一张纸上画一张照片,用你认为应该是的值标记坐标,然后编写你的代码。您应该能够更清楚地看到左上角和右上角(或x,y,宽度和高度)的值。