2

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

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

//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以使其类似于 how Ellipse2D?IE。更改参数以使用高度和宽度而不是右侧和底部

4

2 回答 2

3

对于覆盖部分,我认为这不是一个好主意,因为 RectF 不仅用于椭圆。

您可以通过以您喜欢的方式传递数据来轻松编写绘制椭圆的方法...

就像是:

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);
于 2011-08-01T20:15:36.167 回答
2

为了保持 x、y、宽度、高度的想法,您可以构造一个实用函数来构建一个 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 个参数:xy和。看起来您将宽度设置为;如果中心在点 (100, 120) 的右侧,这将确保宽度是从代码所在的组件中心到点 (100, 120) 的距离的两倍。但是,如果您的组件变得太小,您将分配一个负宽度,这可能会很尴尬。widthheight(centerX - x) * 2

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

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

于 2011-08-01T20:16:48.800 回答