Прокрутка Android SurfaceView

Я пишу приложение андроида, которое создает внеэкранный битовый массив, который является (говорят) что 640*480 пикселей и дисплеи это в SurfaceView. Обратите внимание, что размер изображения больше, чем фактический дисплей на гарнитуре.

Способ, которым работает приложение, состоит в том, что оно первоначально отображает левый верхний угол (0,0) из изображения, и затем я хотел бы смочь прокрутить вокруг изображения.

Мой класс Surfaceview реализует onMeasure обратный вызов и возвращает размер 1024*768, который отображает область изображения, которое соответствует телефонному экрану. Я хотел бы реализовать поддержку прокрутки, которую я нахожу почти невозможным из-за очень ограниченной документации (просто наборы классов и вызовов без когерентности). Я попытался просто назвать scrollBy, и это не работает.

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

13
задан Lee 8 July 2009 в 07:33
поделиться

2 ответа

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

Один из способов сделать это: - расширить SurfaceView и реализовать SurfaceHolder.Callback - использовать getHolder (). AddCallback (this), чтобы получить обратный вызов - Используйте события OnTouch для реализации поведения прокрутки (т. Е. При ответе выберите положение x, y из MotionEvent и установите смещение соответствующим образом).

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

В качестве альтернативы можно использовать растровое изображение вне экрана и рисовать его с помощью обычного ImageView (размер ImageView должен соответствовать размеру растрового изображения и поместить его в режим прокрутки).


Редактировать:

Видя, что это все еще получает просмотры, возможно, стоит отметить, что с этого времени я реализовал и выпустил небольшую библиотеку с открытым исходным кодом, которая реализует структуру для вышеуказанных функций (вдохновлено многими комментариями здесь, среди прочего, SO). Его можно найти на Github: https://github.com/micabyte/android_game

7
ответ дан 2 December 2019 в 01:21
поделиться

Я только что решил это для своей игры, мой SurfaceView является адаптацией примера LunarLander от Google.

Все то же самое, за исключением того, что я рисую на собственном частном растровом изображении с помощью собственного частного холста в методе doDraw, а затем копирую его часть на предоставленный мне холст, используя приведенный ниже код.

Rect src = new Rect(mScrollX, mScrollY, mScrollX+mSurfaceWidth, mScrollY+mSurfaceHeight);
Rect dst = new Rect(0, 0, mSurfaceWidth, mSurfaceHeight);
surfaceCanvas.drawBitmap (mLevelBitmap, src, dst, null);

Объекты Rect определяют, как drawBitmap масштабирует / преобразует пиксели из исходного Bitmap (моего личного растрового изображения) в место назначения (Canvas, который мне дали для рисования в doDraw ()

mScrollX и Y - верхний левый угол прямоугольник, который будет отображаться (относительно большого частного растрового изображения)

mSurfaceWidth / Height - это размер прямоугольника, который будет отображаться

Просто убедитесь, что значения прокрутки находятся в допустимых диапазонах [0, privateBitmapWidth-mSurfaceWidth]

самостоятельно обновляйте значения прокрутки (например, в onTouchEvent ())

3
ответ дан 2 December 2019 в 01:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: