Рисование зеркальных растровых изображений в android
Я пытаюсь научиться делать анимированный спрайт в android и не могу понять, как организовать организацию растровых изображений. У меня есть лист спрайтов моего персонажа, идущий вправо: bitmap пяти копий персонажа, равномерно распределенного (каждые 45 пикселей), в цикле ходьбы.
Я планировал рисовать каждый кадр, рисуя небольшую часть моего растрового изображения спрайта за раз, перейдя:
Rect sourceRect = new Rect(0, 0, 45, 75); canvas.drawBitmap(spriteSheetBitmap, sourceRect, new Rect(0, 0, 45, 75), null);
Затем для следующих кадров добавьте «sourceRect.x» на 45, затем перерисуйте и так далее.
- Android-bitmap
- Android: Как получить уровень сигнала GSM для всех доступных сетевых операторов
- Как избежать% в String.Format?
- Android ListView текущее местоположение прокрутки Y пикселей
- Передача намерения с помощью пула с помощью консоли
Тем не менее, я теперь не уверен, как сделать, чтобы мой спрайт шел влево. Я изначально думал, что могу просто отразить свой прямоугольник, из которого я рисую, чтобы получить перевернутое изображение. Что-то вроде:
sourceRect = new Rect(45, 0, 0, 75);
который, похоже, не работает (не уверен, что на самом деле происходит здесь, но на моей поверхности ничего не получается).
Поиск в Интернете, похоже, я должен сделать копию своего оригинального растрового изображения, зеркально отобразить его с помощью матрицы преобразования, а затем использовать это bitmap для рисования при ходьбе влево. Однако я также нашел реализации, в которых многие мелкие объекты растровых изображений создаются из исходного листа спрайтов, сохраняются (и преобразуются для зеркального движения), а затем используются по мере необходимости.
Поэтому мне интересно, что было бы лучше в этом случае или если есть какая-то разница (производительность / память):
Метод 1: Загрузите на моем исходном листе спрайта, создайте новый экземпляр растрового изображения, зеркалируйте его, затем просчитайте все прямоугольники и используйте эти два целых листа для рисования (по общему признанию, имеется некоторое дополнительное растровое пространство, где лист спрайта не используется) ,
Способ 2: Загрузите в моем исходном листе спрайта, для каждого кадра создайте новые два растровых объекта (1 зеркальный, 1 нормальный) и сохраните их для рисования.
Способ 3: Другие лучшие способы?
- Неизменяемая ошибка сбоя битмапа
- Многоgradleиентные формы
- Блокировка ориентации экрана
- Как resize изображения на Android?
- Как создать текстовый файл и вставить данные в этот файл на Android
- AVD - PANIC: Не удалось открыть ... - не проблема
- Как создать представление, которое больше экрана?
- Определите, работает ли на корневом устройстве
Метод 2 будет слишком дорогим, и вам не понадобится canvas, чтобы перевернуть bitmap. Просто создайте другое bitmap с применением Матрицы, например:
BitmapDrawable flip(BitmapDrawable d) { Matrix m = new Matrix(); m.preScale(-1, 1); Bitmap src = d.getBitmap(); Bitmap dst = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), m, false); dst.setDensity(DisplayMetrics.DENSITY_DEFAULT); return new BitmapDrawable(dst); }
Чтобы отразить ваш спрайт, просто примените следующее преобразование на шкале Canvas: scale (-1, 1). Вам также придется компенсировать спрайт по его ширине.
Чтобы нарисовать вертикальный зеркальный битмап bmp
на canvas
:
Matrix m = new Matrix(); // Mirror is basically a rotation m.setScale( -1 , 1 ); // so you got to move your bitmap back to it's place. otherwise you will not see it m.postTranslate(canvas.getWidth(), 0); canvas.drawBitmap(bmp, m, p);