Android Bitmap/Canvas смещение после масштабирования

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

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

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

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

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

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


person Sunne Rotterz    schedule 26.07.2011    source источник
comment
Вы должны вычислить его, вот подсказка: stackoverflow.com/questions/6749723/   -  person Lumis    schedule 27.07.2011
comment
поэтому, если у меня objectOldX = 0, а pivotX равен 360, а scaleX равен 1,3, то новый объект будет 0 + (0 - 360) * 1,3, что дает -468 .. хм .. сейчас проверю.   -  person Sunne Rotterz    schedule 27.07.2011


Ответы (3)


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

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

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

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

person Lumis    schedule 26.07.2011
comment
это классный мужчина! не могли бы вы привести пример того, как это сделать для других углов :( Я новичок, я знаю, и мне не хватает знаний по математике :( Большое спасибо, чувак! - person Sunne Rotterz; 27.07.2011
comment
Есть два способа. Один из них — использовать ту же формулу для противоположного угла, а другой — вычислить новый размер и добавить его к новым координатам верхнего левого положения, полученным из приведенного выше кода. - person Lumis; 27.07.2011
comment
Я не могу проголосовать за вас, так как я новичок, иначе вы получите всю карму в мире. :) Благодарность. - person Sunne Rotterz; 27.07.2011
comment
есть ли пример для других углов... :( м не могу с ними справиться... плз - person Awais Tariq; 29.09.2011
comment
Я собирался опубликовать свой вопрос об ограничении холста, но нашел вашу формулу. Как я могу поблагодарить?? :).Вы мне очень помогли. Вам спасибо, спасибо, спасибо, большое спасибо. - person Bhavesh Hirpara; 14.06.2012

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

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

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

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

person Felix Ruzzoli    schedule 26.05.2013

Если вы хотите узнать углы экрана относительно исходного холста, вы можете использовать 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
person aostiles    schedule 29.08.2012