Подтвердить что ты не робот

Что делает canvas.translate?

Пример можно найти здесь compass.java. Api здесь

4b9b3361

Ответ 1

Перевести - В основном делать то, что он говорит. Просто переведите холст с помощью x, y. Если вы хотите нарисовать два объекта, а один - просто перевод другого, например x2 = x1 + 50 для каждой точки. Вам не нужно делать все ваши вычисления снова для второго объекта, но вы можете просто перевести холст и снова нарисовать тот же объект. Я надеюсь, что это example поможет вам.

Ответ 2

Даже когда я впервые ответил на этот вопрос несколько лет назад, я действительно не понимал, как сработали преобразования Canvas (например, translate, rotate и т.д.). Раньше я думал, что translate переместил вещь, которую вы рисовали. Фактически, translate перемещает всю систему координат. Это имеет желаемый эффект от перемещения вещи, которую вы рисуете.

На вашем экране, похоже, вы перемещаете чертеж:

Android Canvas.translate() method

Что на самом деле происходит, вы перемещаете систему координат на новое место на холсте:

введите описание изображения здесь

Я рисую дерево сначала (0,0). Затем я переводю начало координат в другое место на холсте. Затем я снова рисую дерево в (0,0). Таким образом, мой код чертежа не должен ничего менять. Изменяется только система координат.

Обычно (0,0) находится в верхнем левом углу вашего представления. Выполнение Canvas.translate перемещает его в другую часть вашего представления.

Сохранение и восстановление системы координат

Вы можете сделать save() и restore(), чтобы вернуться в исходную систему координат.

// draw the tree the first time
canvas.drawBitmap(tree, 0, 0, mPaint);

// draw the tree the second time
canvas.save();
canvas.translate(dx, dy); // dx = change in x, dy = change in y
canvas.drawBitmap(tree, 0, 0, mPaint); // draw still thinks it is at (0,0)
canvas.restore(); // undo the translate 

Когда вы restore, рисунок уже находится на холсте. Восстановление не меняет этого. Он просто перемещает систему координат обратно туда, где она была, когда вы ее сохранили.

Зачем переводить

Обратите внимание, что вы можете добиться такого же эффекта, изменив координаты x, y метода draw:

// draw the tree the first time
canvas.drawBitmap(tree, x, y, mPaint);

// update the x,y coordinates
x += dx;
y += dy;

// draw the tree the second time
canvas.drawBitmap(tree, x, y, mPaint);

Это может быть более интуитивно понятным, исходя из математического фона. Однако, когда вы переводите, вращаете и масштабируете свое изображение, часто очень легко сохранить свою логику рисования одинаковой и просто трансформировать холст. Пересчет x и y для каждой ничьей может быть очень дорогим.

Ответ 3

Представьте, что это печатающая головка.

Я бы сказал, что самый простой способ объяснить это - представить себе печатающую головку струйного принтера или 3D-принтера.

translate в основном "перемещает" печатающую головку вдоль осей X и Y на расстояние, которое вы описываете.

Полученное положение становится новым "происхождением" (0,0).

Теперь, когда мы это понимаем, сделайте простое лицо, выполнив следующее:

Начало начала:

x

Нарисуйте прямоугольник для левого глаза:

canvas.drawRect(10, 10, 10, 10, paint);
 __
|__|

Примечание. "Начало" не изменилось, оно все еще находится в верхнем левом углу этого прямоугольника.

Переместить "происхождение" справа на 20 пунктов:

canvas.translate(20, 0)

 __    x    
|__|

Нарисуйте правый глаз, используя ту же самую команду прямоугольника:

canvas.drawRect(10, 10, 10, 10, paint);
 __     __
|__|   |__|

Переместите "происхождение" обратно в исходное положение X и переместите его вниз по оси Y:

canvas.translate(-20, 20) // Positive numbers for the second param is "down" on the y-axis.

 __     __
|__|   |__|

x

И нарисуйте рот, чтобы закончить его:

canvas.drawLine( 0, 0, 30, 0, paint ); 
 __     __
|__|   |__|

___________

Не идеально масштабировать, так как вы можете делать только с моноширинным шрифтом.:)

Ответ 4

он изменит положение вашего canvaz (кроме масштаба) либо x, либо y если мы переводим и масштабируем, то это преобразование в общей терминологии