Android растровое / холст смещение после масштаба - PullRequest
5 голосов
/ 26 июля 2011

Если у меня есть холст, на котором я рисую растровое изображение следующим образом:

canvas.drawBitmap(bmLargeImage, srcRect, destRect, paint);

и я масштабирую растровое изображение:

canvas.scale(1.5f, 1.5f, 450, 250);

Я хочу получить положение растрового изображения после масштаба. Если позиция до масштаба была (0, 0), то после масштаба есть смещение, и мне нужно это смещение ... как я могу его получить?

Спасибо и простите за простой вопрос, новичок здесь ...

Ответы [ 3 ]

15 голосов
/ 27 июля 2011

Хорошо, давайте попробуем найти лучшую формулу для этого

canvas.scale(scaleX, scaleY, pivotX, pivotY);  

if (scaleX >= 1){    
  objectNewX = objectOldX + (objectOldX - pivotX)*(scaleX - 1); 
}else{   
  objectNewX = objectOldX - (objectOldX - pivotX)*(1 - scaleX); 
}

То же самое для objectNewYНовые ширина и высота растрового изображения, конечно, будут кратны старому размеру и масштабу.

4 голосов
/ 26 мая 2013

Я считаю, что самым чистым решением было бы использование лежащей в основе матрицы преобразования холста, которым вы управляете.

В Android существует метод canvas.getMatrix(Matrix cmt), который даст его.Матрица преобразования преобразует любую точку в мировом пространстве, которую вы выбрасываете, в экранные координаты.Просто используйте matrix.mapPoints(float[] points) и все будет в порядке.

К вашему сведению, вы можете легко сделать это и наоборот.Если вы хотите знать, какие координаты экрана отображаются в какой точке мирового пространства, например, для постукивания;для этого можно использовать обратную матрицу.Его можно получить методом matrix.invert(Matrix out).Затем используйте его mapPoints() для отображения координат.

Вот официальные документы: mapPoints () , invert () , getMatrix ()

2 голосов
/ 30 августа 2012

Если вы хотите знать углы экрана относительно исходного холста, вы можете использовать canvas.getClipBounds(). Это возвращает Rect с координатами края относительно вашего исходного холста. Например, если вы начинаете с размера холста 320 x 480 и звоните

canvas.scale(2, 2, getWidth()/2, getHeight()/2);

, а затем

canvas.getClipBounds();

у вас будет Rect (назовите это rect), где

rect.top == 120
rect.bottom == 360
rect.left == 80
rect.right == 240
...