Различия между рисованием эллипса в Android и Java - PullRequest
2 голосов
/ 01 августа 2011

В 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 ]

3 голосов
/ 02 августа 2011

Что касается переопределения, я не думаю, что это было бы хорошей идеей, поскольку 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);
2 голосов
/ 02 августа 2011

Чтобы учесть 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, ширина и высота) значения.

...