Android: нарисуйте растровое изображение поверх другого, применив матрицу

У меня есть изображение, в котором используется матрица для масштабирования / перетаскивания изображения. Теперь я хочу наложить другое изображение. Матричное преобразование следует применять к комбинации фона и наложения.

Я перезаписал onDraw и использовал

    canvas.drawBitmap(overlay, matrix, null);

в то время как оверлей - это новый оверлей, матрица - это текущая применяемая матрица. Это прекрасно работает. К сожалению, я не могу указать смещение, при котором наложение должно отображаться поверх фона. Это работает

    canvas.drawBitmap(overlay, 50, 10, null);

но наложение остается в этом положении, как только я снова рисую и масштабирую фон ...

Как выполнить смещение при рисовании растрового изображения с примененной матрицей?

С Уважением


person decades    schedule 13.07.2011    source источник


Ответы (1)


Возможно, вам потребуется создать новое растровое изображение подходящего размера, где ваше наложение будет сохранено с матричным преобразованием. Что-то типа:

Bitmap overlay2 = Bitmap.createBitmap(....) 

Canvas c2 = new Canvas(overlay2);

c2.drawBitmap(overlay, matrix, null);

canvas.drawBitmap(overlay2, 50, 10, null);

Другой способ, возможно, лучше - это сделать canvas.translate:

canvas.save();
canvas.translate(50,10);
canvas.drawBitmap(overlay, matrix, null); 
canvas.restore();
person Lumis    schedule 13.07.2011
comment
Уммм. Ямми. Как быстро :) Тем временем я тоже пришел к первому решению, но оно показало некоторые уродливые эффекты на окружающей области наложения. Ваше второе решение работает отлично. Мэнни, спасибо. - person decades; 13.07.2011
comment
Аргхх .. Нет, второй не работает. Если изображение увеличивается, наложение перемещается по фону ... - person decades; 13.07.2011
comment
Это потому, что вам нужно умножить количество перевода на величину увеличения. - person Lumis; 13.07.2011
comment
Точно. Уже сделано. Но это дает ухабистый вид. Сейчас я сохраняю значения, используемые для matrix.postScale. Но лучше я думаю их читать с матрицы. Нужно проверить, возможно ли это. - person decades; 13.07.2011
comment
Теперь работает отлично. Получение масштаба с помощью matrix.getValues ​​(). MSCALE_ и MSCALE_Y умножить с моим переводом - готово :) - person decades; 13.07.2011
comment
Полезно знать о matrix.postScale и matrix.getValues, которые раньше не пробовали :) - person Lumis; 13.07.2011
comment
Да, очень хорошо работает. Вот соответствующие части значений с плавающей запятой [] = new float [9]; matrix.getValues ​​(значения); Log.d (TAG, ScaleX = + значения [Matrix.MSCALE_X] + ScaleY = + значения [Matrix.MSCALE_Y]); canvas.translate (100 * значения [Matrix.MSCALE_X], 100 * значения [Matrix.MSCALE_Y]); - person decades; 13.07.2011