Intereting Posts
Android Hardware Acceleration – использовать или не использовать? GetToken () не удалось. Ошибка состояния BAD_AUTHENTICATION Возможно ли в принципе для Android-устройства взаимодействовать с iPhone через Bluetooth / GameKit? Установка EditText imeOptions в actionNext не влияет Как отправить данные из одного фрагмента в другой фрагмент? Android In-App Billing v3: «Невозможно выполнить операцию: queryInventory» Как вы устанавливаетеLayoutParams () для ImageView? К сожалению, MyApp остановился. Как я могу это решить? ExpandableListView сворачивает все родительские элементы Как остановить воспроизведение youtube видео в веб-браузере Android? Android 4.2.2 Отладка USB-опции «Всегда разрешать с этого компьютера» приводит к неизвестной цели для устройства? «Преобразование в формат Dalvik с ошибкой 1» на внешнем JAR Как заставить `scrollbar` появляться с левой стороны? Проблема с обратным вызовом на экране в полноэкранном режиме Android Как использовать Simple HTTP-клиент в Android?

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

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

Solutions Collecting From Web of "Что делает canvas.translate?"

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

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

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

Метод Android Canvas.translate ()

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

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

Сначала я рисую дерево (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 для каждой ничьей может быть очень дорогостоящим.

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

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

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); __ __ |__| |__| 

Переместите «origin» обратно в исходное положение 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 ); __ __ |__| |__| ___________ 

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

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