Я пишу приложение андроида, которое создает внеэкранный битовый массив, который является (говорят) что 640*480 пикселей и дисплеи это в SurfaceView. Обратите внимание, что размер изображения больше, чем фактический дисплей на гарнитуре.
Способ, которым работает приложение, состоит в том, что оно первоначально отображает левый верхний угол (0,0) из изображения, и затем я хотел бы смочь прокрутить вокруг изображения.
Мой класс Surfaceview реализует onMeasure обратный вызов и возвращает размер 1024*768, который отображает область изображения, которое соответствует телефонному экрану. Я хотел бы реализовать поддержку прокрутки, которую я нахожу почти невозможным из-за очень ограниченной документации (просто наборы классов и вызовов без когерентности). Я попытался просто назвать scrollBy, и это не работает.
Если бы у кого-либо есть какие-либо указатели о том, как продолжить двигаться, это очень ценилось бы.
Когда вы начинаете использовать SurfaceView, вы перемещаетесь в мир, где у вас есть пустая область пикселей, и вы сами можете их нарисовать как вы хотите. Вы все делаете сами - а значит, вам тоже нужно самому реализовать скроллинг. Это нетривиально, но и не слишком сложно.
Один из способов сделать это: - расширить SurfaceView и реализовать SurfaceHolder.Callback - использовать getHolder (). AddCallback (this), чтобы получить обратный вызов - Используйте события OnTouch для реализации поведения прокрутки (т. Е. При ответе выберите положение x, y из MotionEvent и установите смещение соответствующим образом).
Реализуйте поток для обработки обновления изображения. Примеры этого есть в сети (извините, сейчас их нет под рукой).
В качестве альтернативы можно использовать растровое изображение вне экрана и рисовать его с помощью обычного ImageView (размер ImageView должен соответствовать размеру растрового изображения и поместить его в режим прокрутки).
Редактировать:
Видя, что это все еще получает просмотры, возможно, стоит отметить, что с этого времени я реализовал и выпустил небольшую библиотеку с открытым исходным кодом, которая реализует структуру для вышеуказанных функций (вдохновлено многими комментариями здесь, среди прочего, SO). Его можно найти на Github: https://github.com/micabyte/android_game
Я только что решил это для своей игры, мой 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 ())