Прокрутка Android SurfaceView
Я пишу приложение для Android, которое строит внешнее растровое изображение, которое (скажем) 640 * 480 пикселей и отображает его в SurfaceView. Обратите внимание, что размер изображения больше фактического отображения на трубке.
Способ работы приложения состоит в том, что он сначала отображает верхний левый угол (0,0) изображения, а затем я хотел бы иметь возможность прокручивать изображение.
Класс My Surfaceview реализует обратный вызов onMeasure и возвращает размер 1024 * 768, который отображает область изображения, соответствующую экрану телефона. Я хотел бы реализовать поддержку прокрутки, которую я нахожу почти невозможным из-за очень ограниченной документации (просто пучки классов и звонков без согласованности). Я пробовал просто вызвать scrollBy, и это не работает.
Если у кого есть какие-либо указатели о том, как это сделать, вам будет очень благодарна.
Ответы
Ответ 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())