Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android和Java中绘制椭圆的区别_Java_Android_Path_Ellipse - Fatal编程技术网

Android和Java中绘制椭圆的区别

Android和Java中绘制椭圆的区别,java,android,path,ellipse,Java,Android,Path,Ellipse,在Java中,由于某种原因,Ellipse2D.Double使用参数(高度、宽度、x、y),其中当我在Android中创建RectF时,参数是(左、上、右、下),因此我对调整这些差异感到有点困惑 如果使用Java创建椭圆,请使用以下命令: //Ellipse2D.Double(height, width, x, y) x = 100; y = 120; centerX = getWidth() / 2; centerY = getHeight() / 2; //Ellipse2D.Doubl

在Java中,由于某种原因,
Ellipse2D.Double
使用参数
(高度、宽度、x、y)
,其中当我在Android中创建
RectF
时,参数是
(左、上、右、下)
,因此我对调整这些差异感到有点困惑

如果使用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
,使其与
Ellipse2D
的方式类似?例如,更改参数以使用高度和宽度,而不是右侧和底部?

对于覆盖部分,我认为这不是一个好主意,因为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);

为了保持对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、宽度和高度。 看起来您正在将宽度设置为(centerX-x)*2;这将确保宽度是代码所在组件中心到点(100120)距离的两倍(如果中心位于点(100120)的右侧)。但是,如果组件太小,则会指定负宽度,这可能会很尴尬

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


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

很抱歉,这个示例只是虚构的,在阅读您的文章后,我意识到我混淆了
Ellipse2D
中参数的顺序。我想做的就是创建一个
RectF
,它可以采用与
Ellipse2D
相同的参数。所以我相信你和BrainCrash说得对,我需要创建一个实用函数来为我做这项工作。我只是对如何正确进行转换感到困惑,我假设您的两种方法都是正确的方法?谢谢您的回复,我相信您和Atreys说的是正确的,我只需要创建一个小函数来为我处理转换