Нарисуйте изображение, плавающее над другим в Android - PullRequest
1 голос
/ 17 сентября 2011

Я хочу иметь возможность динамически размещать изображения над другими изображениями в моем приложении. Рассматривая первое изображение в качестве фона, а остальные изображения на верхнем уровне, мне также нужно будет переместить эти изображения верхнего уровня (изменить их x и y на экране) также по коду.

Представьте, например, море, в которое пользователь кладет рыбу и морских животных, затем эти морские животные начинают перемещаться тут и там на экране: это будет так.

Как я могу это сделать? Если вы не знаете, но помните какую-либо простую программу или демонстрацию, которая делает это, это также будет очень кстати!

Спасибо!

1 Ответ

2 голосов
/ 17 сентября 2011

Конечно, есть несколько способов сделать это, но я бы сказал, что лучший способ сделать это - создать пользовательский View (класс, производный от View) и иметь этот дескриптор. ваш растровый рисунок и все ваши сенсорные события.

Нужно написать много кода для загрузки Bitmap s и отслеживания всех их позиций (а затем вывести их на холст в onDraw), но если вы начнете с малого, просто разрешив одно изображение чтобы рисовать и перетаскивать по экрану, вы можете опираться на это и сохранять свой код организованным.

Вам нужно переопределить onDraw(Canvas) и onTouchEvent(MotionEvent) в своем пользовательском View. Вы загрузите свои растровые изображения с помощью BitmapFactory (decodeResource метод, если вы включаете изображения в качестве ресурсов в свой проект), и вам нужно будет не забывать вызывать recycle на своих растровых изображениях, когда вы больше не используете их.

В onDraw вы рисуете свои растровые изображения на холсте в определенном месте, используя Canvas.drawBitmap. Вы можете выбрать одну из двух перегрузок этого метода: одну, которая принимает верхнюю и левую координаты растрового изображения как float s (и, следовательно, не выполняет масштабирование или растяжение), а другую, которая принимает прямоугольник назначения и источник для выполнения масштабирования, растяжение и размещение.

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

Когда что-то меняется внутри вашего представления (как в случае события касания), вызовите метод invalidate(), и среда будет знать, чтобы перерисовать все, что вызывает ваш onDraw метод.

...