Подтвердить что ты не робот

Android: как сделать кликабельное изображение карты с каждой страной, производя другое действие?

Мне нужно отобразить симпатичный образ карты Европы, и я хочу, чтобы мое приложение, например, вызывать различные действия, когда пользователь нажимает на каждую страну - каждая страна на карте должна иметь другой onClickListener (или эквивалент).

По сути, мне нужно иметь возможность вызвать другую функцию, когда пользователь нажимает на Францию, а не на Испанию, на изображение, подобное этому: http://commons.wikimedia.org/wiki/File:Blank_map_of_Europe_cropped.svg

Как мне лучше всего поступить на Android?

У меня есть идеи, но может быть какой-то простой способ, который я пропускаю.

Большое спасибо заранее!

Cheers, r3mo

4b9b3361

Ответ 1

Вот как я решил подобную проблему.

Сначала дублируйте изображение, которое вы хотите использовать в качестве карты изображения, и покрасьте каждый раздел. Разумеется, для каждого раздела различный цвет: D. Затем создайте два образа в вашем макете. Установите фон первого в качестве изображения, которое вы хотите отобразить на экране, а фон второго - как цвет в одном.

Затем установите видимость второго ImageView невидимым. Если вы запустите программу в этот момент, вы увидите изображение, которое вы хотите отобразить. Затем используйте прослушиватель OnTouch и получите цвет пикселя, в который вы коснулись. Цвет будет соответствовать цвету цветного изображения.

Следующий метод getColour должен быть передан координатами x и y события касания. R.id.img2 - невидимый образ.

private int getColour( int x, int y)
{
    ImageView img = (ImageView) findViewById(R.id.img2);
    img.setDrawingCacheEnabled(true); 
    Bitmap hotspots=Bitmap.createBitmap(img.getDrawingCache()); 
    img.setDrawingCacheEnabled(false);
    return hotspots.getPixel(x, y);
}

Надеюсь, это помогло вам:).

Ответ 2

Я сделал это с маской, как указал Скотти, но у меня возникли проблемы. В принципе, цвета, возвращаемые getPixel, были немного разными, чем в файле маски. Я сделал, чтобы загрузить маску в памяти с отключенным масштабированием и с такими полными цветовыми параметрами, как это:

BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inTargetDensity = 1;
bitmapOptions.inDensity = 1;
bitmapOptions.inDither = false;
bitmapOptions.inScaled = false;
bitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;
mask = BitmapFactory.decodeResource(appContext.getResources(), resMask, bitmapOptions);

Затем я посмотрел на коорды из масштабированного изображения следующим образом:

ImageView map = (ImageView) findViewById(R.id.image);
Drawable drawable = map.getDrawable();
Rect imageBounds = drawable.getBounds();
int scaledHeight = imageBounds.height();
int scaledWidth = imageBounds.width();
int scaledImageOffsetX = Math.round(event.getX()) - imageBounds.left;
int scaledImageOffsetY = Math.round(event.getY()) - imageBounds.top;

int origX = (scaledImageOffsetX * mask.getWidth() / scaledWidth);
int origY = (scaledImageOffsetY * mask.getHeight() / scaledHeight);

if(origX < 0) origX = 0;
if(origY < 0) origY = 0;
if(origX > mask.getWidth()) origX = mask.getWidth();
if(origY > mask.getHeight()) origY = mask.getHeight();

а затем я применил mask.getPixel(origX, origY). Он работает только тогда, когда изображение масштабируется с помощью android: scaleType = "fitXY" внутри ImageView, в противном случае блокировки отключены.

Ответ 3

Я не пробовал, но это выглядит очень многообещающим.

Я собираюсь попробовать его в своем проекте, надеюсь, он работает для вас, ребята.

Этот парень в основном пытается подражать HTML Tag Map в дроиде с масштабированием и перетаскиванием.

Ответ 4

Я последовал за ответом clausundercover, но все еще имел проблемы с согласованностью цвета пикселя над регионом. Что в конечном итоге сработало для меня, так это убедиться, что я использую PNG-изображение с индексированным цветом для маски. В моем случае я использовал веб-оптимизированную палитру (216 цветов) и удостоверился, что любые цвета, которые я выбрал, были значениями из этой палитры. Как только я сделал это изменение, я получил то же значение цвета во всем регионе.