2013-03-25 3 views
2

Я пытаюсь разработать приложение для Android, чтобы отображать масштабируемую карту с возможностью панорамирования (это просто растровое изображение), что также позволяет пользователю нажимать на определенные точки на карта.Отображение растрового изображения на холсте в Surfaceview

Я изо всех сил пытаюсь найти наиболее эффективный способ реализации такого приложения. Попробовав множество других методов (включая Webviews, OpenLayers), лучший способ (по крайней мере, по данным этого сайта), похоже, использует SurfaceView с Canvas. Код, который я до сих пор, собран из фрагментов, которые я нашел по всему Интернету, поэтому он просто падает. Я включил его здесь в любом случае в надежде, что это дает некоторое представление о том, что я пытаюсь достичь:

public class Main extends Activity { 

private Bitmap bmp; 
    private SurfaceView surfaceView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     surfaceView = (SurfaceView)findViewById(R.id.surface); 
     bmp = BitmapFactory.decodeResource(getResources(), 
      R.drawable.testmapbmp); 
     //decode the bitmap file 

     Canvas canvas = new Canvas(bmp); 
     //create a canvas from the bitmap, then display it in surfaceview 
     surfaceView.draw(canvas); 
    } 
} 

Это лучший способ для достижения функциональности я хочу для моего приложения? Или есть лучший способ, особенно если я могу столкнуться с проблемами позже, например, с помощью интерактивных разделов карты.

Мне действительно нужна помощь от кого-то, кто создал что-то подобное раньше, поэтому я могу получить мой повод о проблеме, но я очень ценю любую помощь/указатели/советы вообще!

Thanks

ответ

2

Ваша часть кода на самом деле неверна.

Обычно, если вы хотите сделать это, если вам нужно создать свой собственный пользовательский вид (путем наследования вида или SurfaceView). В подклассе View вам необходимо переопределить метод onDraw (Canvas) и нарисовать растровое изображение на холсте с помощью одного из методов холста.

Чтобы сделать его пригодным для подгонки и масштабирования, вам необходимо использовать классы Scroller и ScaleGestureDetector. Обычно панорамирование или масштабирование выполняется путем применения аффинных преобразований к холсту с использованием его методов (поворот, масштабирование, перевод).

Разница между SurfaceView и View заключается в том, что в SurfaceView вы можете рисовать непосредственно из отдельного потока, а это значит, что вы можете организовать там цикл выделения и извлечь из него. Это хорошо для простых игр и анимационных эффектов. Я считаю, что для рисования растрового изображения это излишне и намного проще для подкласса View.

Я бы начал с this и this, если бы вы были на вас.

+0

Спасибо! Это очень помогает! – logicalfox

Смежные вопросы