Различия между рисованием эллипса в Android и Java

В 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 сделать так же, как Ellipse2D? То есть. изменить параметры для работы с высотой и шириной, а не справа и снизу?

2 ответа

Решение

Что касается переопределения, я не думаю, что это было бы хорошей идеей, поскольку 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; это гарантирует, что ширина будет вдвое больше расстояния от центра компонента, в котором находится ваш код, до точки (100,120), если центр находится справа от точки (100, 120). Если ваш компонент становится слишком маленьким, вы назначите отрицательную ширину, что может быть неудобно.

Кроме того, вы используете жестко закодированные значения в вашем примере RectF и комбинируете 120 (y?) И 100 (x?) В одних и тех же аргументах RectF, что, скорее всего, не то, что вы хотите сделать.

Я бы предложил нарисовать картинку на листе бумаги, обозначить координаты значениями, которые, как вы думаете, должны быть, а затем написать свой код. Вы должны быть в состоянии более четко увидеть, какими должны быть ваши верхние левые нижние и правые (или x, y, ширина и высота) значения.

Другие вопросы по тегам