Подтвердить что ты не робот

Прокрутка Android SurfaceView

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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


Edit:

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

Ответ 2

Я просто решил это для своей собственной игры, моя поверхностьView - это адаптация LunarLander от Google.

Все одно и то же, за исключением того, что я рисую собственный собственный Bitmap с моим собственным личным Canvas в методе 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 масштабирует/преобразует пиксели из исходного растрового изображения (мое частное растровое изображение) в пункт назначения (Canvas я был предоставлен для рисования в doDraw()

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

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

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

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