在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浏览器。更改参数以使用高度和宽度而不是右下角?
答案 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,宽度和高度)的值。