Android: как сделать кликабельное изображение карты с каждой страной, производя другое действие?
Мне нужно отобразить симпатичный образ карты Европы, и я хочу, чтобы мое приложение, например, вызывать различные действия, когда пользователь нажимает на каждую страну - каждая страна на карте должна иметь другой onClickListener (или эквивалент).
По сути, мне нужно иметь возможность вызвать другую функцию, когда пользователь нажимает на Францию, а не на Испанию, на изображение, подобное этому:
http://commons.wikimedia.org/wiki/File:Blank_map_of_Europe_cropped.svg
Как мне лучше всего поступить на Android?
У меня есть идеи, но может быть какой-то простой способ, который я пропускаю.
Большое спасибо заранее!
Cheers,
r3mo
Ответы
Ответ 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 цветов) и удостоверился, что любые цвета, которые я выбрал, были значениями из этой палитры. Как только я сделал это изменение, я получил то же значение цвета во всем регионе.