Отображение растрового изображения на холсте в Surfaceview


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

Я изо всех сил пытаюсь найти наиболее эффективный способ реализации такого приложения. После многочисленных попыток других методов (включая Webviews, OpenLayers), лучшим способом (по крайней мере, на этом сайте), кажется, является использование SurfaceView с холстом. Код, который у меня есть до сих пор, составлен из кусочков фрагменты я нашел по всему интернету, так что он просто вылетает. Я включил его сюда в любом случае в надежде, что он дает некоторое представление о том, чего я пытаюсь достичь:
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);
    }
}

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

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

Спасибо

1 2

1 ответ:

Ваш фрагмент кода не совсем корректен.

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

, чтобы сделать его возможности и Пинч-масштабирования, вы должны использовать скроллер и ScaleGestureDetector классов. Обычно панорамирование или масштабирование выполняется путем применения аффинные преобразования холста с помощью его методов (поворот, масштабирование, перевод).

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

Я бы начал с этого и этого , если бы я был ты.