2010-10-18 31 views
18

Tôi cần hiển thị hình ảnh đẹp của bản đồ Châu Âu và tôi muốn ứng dụng của mình, ví dụ: mang đến một hoạt động khác, khi người dùng nhấp vào từng quốc gia - mỗi quốc gia trên bản đồ cần phải có onClickListener (hoặc tương đương) khác nhau.Android: cách tạo hình ảnh bản đồ có thể nhấp với mỗi quốc gia tạo ra một hành động khác?

Về cơ bản, tôi cần để có thể gọi một chức năng khác nhau khi người dùng chạm vào Pháp chứ không phải Tây Ban Nha trong một hình ảnh như thế này: http://commons.wikimedia.org/wiki/File:Blank_map_of_Europe_cropped.svg

Làm thế nào tôi sẽ tốt nhất đi về vấn đề này trên Android?

Tôi có ý tưởng, nhưng có thể có một số cách đơn giản mà tôi đang xem.

Rất cám ơn trước!

Chúc mừng, r3mo

+0

Làm cách nào để bạn có thể suy ra quốc gia từ điểm được nhấp? Tốt nhất là người nghe sẽ biết tọa độ màn hình và đó là tất cả. Nó sẽ không có ý tưởng, nơi ranh giới quốc gia được trên màn hình – NickT

+2

Thật vậy, người nghe sẽ chỉ biết tọa độ được nhấp. Hai cách: Có bản đồ bao gồm nhiều hình ảnh với người nghe, một cho mỗi quốc gia, tất cả chồng chéo lên một mức độ nào đó để bản đồ có vẻ chính xác. Có lẽ có một số phương pháp để làm điều này? Ngoài ra, tôi sẽ tô màu cho mỗi quốc gia một chút khác nhau (1 bit), để tất cả chúng trông giống nhau, nhưng tôi có thể kiểm tra màu sắc tại tọa độ hình ảnh được nhấp và nhìn lên trong bảng để tìm màu nước tương ứng đến. Mặc dù tôi đánh giá cao việc bạn dành thời gian để bình luận, có lẽ ai đó khác có thể cố gắng hữu ích hơn? – r3mo

+0

Bản sao có thể có của [khu vực có thể nhấp của hình ảnh] (http://stackoverflow.com/questions/16670774/clickable-area-of-image) – lukle

Trả lời

29

Dưới đây là cách tôi giải quyết một vấn đề tương tự.

Đầu tiên sao chép hình ảnh mà bạn muốn sử dụng làm bản đồ hình ảnh và tô màu từng phần. Không cần phải nói, một màu khác nhau cho mỗi phần: D. Sau đó, tạo hai ImageView trong bố cục của bạn. Đặt nền của hình ảnh đầu tiên làm hình ảnh mà bạn muốn hiển thị trên màn hình và nền của hình ảnh thứ hai dưới dạng màu được tô màu.

Sau đó đặt chế độ hiển thị của ImageView thứ hai thành ẩn. Nếu bạn chạy chương trình tại thời điểm này, bạn sẽ thấy hình ảnh mà bạn muốn hiển thị. Sau đó, sử dụng một người nghe OnTouch và nhận được màu của điểm ảnh mà bạn chạm vào. Màu sẽ tương ứng với màu của hình ảnh màu.

Phương thức getColour sau đây sẽ cần được chuyển qua tọa độ x và y của sự kiện chạm. R.id.img2 là hình ảnh vô hình.

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); 
} 

Hy vọng đây là một số trợ giúp cho bạn :).

+0

bạn có biết bất kỳ hướng dẫn nào đã triển khai phương pháp này hoặc một số mã mẫu không? – Kgrover

+0

Sẽ không hoạt động với Config.RGB_565, đã làm việc với: Bitmap.Config.ARGB_8888 – Guy

+1

@scotty làm cách nào bạn biết được điểm nóng nào được chạm vào nếu có nhiều điểm nóng trong hình ảnh. –

2

Tôi đã làm điều đó với mặt nạ như Scotty đã chỉ ra, nhưng tôi gặp phải nhiều vấn đề hơn. Về cơ bản, màu sắc được trả về bởi getPixel hơi khác so với tệp mặt nạ. Những gì tôi đã làm là để tải các mặt nạ trong bộ nhớ với mở rộng quy mô tàn tật và với các tùy chọn đầy đủ màu sắc như thế này:

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); 

Sau đó, tôi nhìn lên các coords từ hình ảnh thu nhỏ như thế này:

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(); 

và sau đó Tôi đã áp dụng mask.getPixel (origX, origY). Nó chỉ hoạt động khi hình ảnh được chia tỷ lệ với android: scaleType = "fitXY" bên trong ImageView nếu không coords tắt.

1

Tôi đã theo dõi câu trả lời của clausundercover nhưng vẫn gặp sự cố với tính nhất quán của màu pixel trên một khu vực. Điều cuối cùng làm việc cho tôi là đảm bảo rằng tôi sử dụng hình ảnh PNG có màu được lập chỉ mục cho mặt nạ. Trong trường hợp của tôi, tôi đã sử dụng bảng màu tối ưu hóa web (216 màu) và đảm bảo rằng bất kỳ màu nào tôi chọn đều là các giá trị từ bảng màu đó. Khi tôi thực hiện thay đổi này, tôi nhận được cùng một giá trị màu trên toàn bộ khu vực.

2

Tôi chưa thử, nhưng this trông rất hứa hẹn.

Tôi sắp thử nó trong dự án của mình, tôi hy vọng nó hoạt động cho các bạn.

Anh chàng này về cơ bản đang cố gắng mô phỏng HTML Tag Map trong droid với thu nhỏ và kéo chụm.

Các vấn đề liên quan