Как нарисовать много изображений на какой-либо поверхности с помощью панорамирования / масштабирования? - PullRequest
2 голосов
/ 15 декабря 2010

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

Что мне нужно, так это иметь какую-то поверхность, на которой я могу рисовать / рисовать / любые партии изображений, возможно, PNG с прозрачностью. Мне нужно иметь возможность перемещаться и увеличивать эту поверхность со всеми этими изображениями. Мне также нужно иметь возможность нажимать на любое из этих изображений и знать, какое из них было нажато.

Я читал учебник One Finger Zoom от разработчиков Sony Ericsson, и это похоже на хорошее решение для того, что я хочу сделать. Но я немного сбит с толку, потому что этот код предназначен для одного растрового изображения, и мне нужно, чтобы их было много на некоторой поверхности / холсте.

Я думаю о двух способах сделать это:

  1. Адаптируйте код так, чтобы я мог рисовать каждое изображение на Canvas (из onDraw()), но вот где я запутался, я не вижу, как мне это сделать, потому что текущий код прост для одно изображение, не так много, чтобы учитывать.
  2. Наложение всех моих изображений в один растровый рисунок и использование этого растрового изображения в качестве фона для Canvas (еще раз из onDraw()). Я мог бы сохранить положение этих изображений в Canvas в массив или что-то еще и использовать это как ссылку, чтобы увидеть, нажал ли пользователь какой-либо из них. Я полагаю, это возможно таким образом?

Итак, на самом деле вот что я спрашиваю:

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

Это очень простая игра, о которой я думаю, и прежде чем идти по этому пути, OpenGL - это слишком много для того, что мне нужно, и я хочу сделать один шаг за раз. Сначала изучите программирование на Android, а когда-нибудь изучите OpenGL.

Ответы [ 4 ]

2 голосов
/ 24 декабря 2010

Почему бы не посмотреть, можете ли вы использовать (или расширить) ItemizedOverlay, как и в MapView.ItemizedOverlay позволяет вам добавлять «маркеры», обычно это рисунки в формате PNG, которые могут быть разными.Они реагируют на сенсорные события или жесты и располагаются в соответствии с местоположением экрана (которые переводятся в координаты карты через MapProjection).(Я использую их в картографическом приложении, над которым я работаю).Макеты имеют свой собственный метод draw (), который требует MapView, но вы можете обнулить его или отключить показ любого слоя карты и показать какой-либо другой вид фона - здесь потребуются эксперименты.

1 голос
/ 21 июня 2011

Этот вопрос немного устарел, но у меня есть одно решение и еще один вопрос: -)

Для того, чтобы мне удалось отбросить несколько изображений, я создаю ArrayList с этим классом (ColorBall):

private Bitmap img; // the image of the ball
private int coordX = 0; // the x coordinate at the canvas
private int coordY = 0; // the y coordinate at the canvas
private int id; // gives every ball his own id, for now not necessary
private static int count = 1;
private boolean goRight = true;
private boolean goDown = true;
private int height = 50;
private int width = 50; 
private Rect mRectSrc = new Rect();
private Rect mRectDst = new Rect();

В представлении, когда я щелкаю, если я щелкнул внутри границ изображения, я изменяю скоординированные координаты X и координаты Y (легко проверить с помощью if (x > ball.getX() && x < ball.getX()+ball.getWidth() && y > ball.getY() && y < ball.getY()+ball.getHeight()).).

В событии OnDraw я просто прохожу все элементы в массиве и рисую их там, где это соответствует.

for (ColorBall ball : colorballs) {
    canvas.drawBitmap(ball.getBitmap(), ball.getX(), ball.getY(), null);
}

Однако я все еще застрял с масштабированием.Я пытаюсь решить это, как в следующем посте (http://stackoverflow.com/questions/6422759/zoom-a-bitmap-with-drawbitmap-and-rectangles-android),, но я все еще заблокирован с этим: - (

Приветствия

1 голос
/ 30 декабря 2010

Ваше первое решение (вставлено ниже) является лучшим, на мой взгляд.

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

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

Чтобы сделать их сенсорными, используйте метод setOnTouchListener (или переопределите onTouch (), если вы используете подклассы View, я не прочитал предоставленную вами ссылку), чтобы предоставить обработчик, который будет вызываться при каждом вызове представления , Обработчику будет дано местоположение каждого события касания, которое вы можете использовать, чтобы определить, какое изображение было затронуто, если оно было. То, как вы будете проверять столкновения, будет, конечно, зависеть от специфики вашей игры.

Этот метод не самый чистый, но он самый простой (и самый быстрый в зависимости от того, как вы это делаете!). Лично OpenGL пугает, но преодоление кривой обучения в будущем очень окупится (как vim или emacs!), Это было сделано для такого варианта использования.

Дополнительную информацию об обработке сенсорных событий см. По этой ссылке. http://developer.android.com/guide/topics/ui/ui-events.html

1 голос
/ 15 декабря 2010

Позвольте мне понять это прямо. Вы хотите, чтобы несколько изображений, каждое из которых было осязаемым? Если так, возможно, вам следует подумать немного более абстрактно.

Возможно, было бы проще рассматривать каждое изображение как объект просмотра (просто идея), поскольку объекты просмотра уже встроены в onTouchListeners

...