2010-10-18 7 views
18

मुझे यूरोप के मानचित्र की एक सुंदर छवि प्रदर्शित करने की आवश्यकता है, और मैं अपना ऐप चाहता हूं, उदा। एक अलग गतिविधि लाएं, जब उपयोगकर्ता प्रत्येक देश पर क्लिक करता है - मानचित्र पर प्रत्येक देश को अलग-अलग क्लिकक्लिस्टर (या समकक्ष) की आवश्यकता होती है।एंड्रॉइड: एक अलग कार्रवाई का उत्पादन करने वाले प्रत्येक देश के साथ एक क्लिक करने योग्य मानचित्र छवि कैसे बनाएं?

अनिवार्य रूप से, मैं इस जैसे जब उपयोगकर्ता एक छवि में फ्रांस के बजाय स्पेन पर टैप करता एक अलग समारोह कॉल करने के लिए सक्षम होना चाहिए: http://commons.wikimedia.org/wiki/File:Blank_map_of_Europe_cropped.svg

कैसे मैं सबसे अच्छा एंड्रॉयड पर इस बारे में जाना होगा?

मुझे विचार मिल गए हैं, लेकिन कुछ सरल तरीका हो सकता है जो मैं देख रहा हूं।

अग्रिम में बहुत धन्यवाद!

चीयर्स, r3mo

+0

आप पृथ्वी पर क्लिक किए गए बिंदु से देश को कैसे कम कर पाएंगे? सबसे अच्छा श्रोता स्क्रीन निर्देशांक को जानता होगा और यह सब कुछ है। यह पता नहीं होगा कि राष्ट्रीय सीमाएं स्क्रीन पर – NickT

+2

पर थीं, दरअसल, श्रोता केवल समन्वयकों को ही क्लिक करेगा। दो तरीकों: नक्शा श्रोताओं के साथ कई छवियों से बना है, प्रत्येक देश के लिए एक, कुछ हद तक ओवरलैपिंग ताकि नक्शा सही दिखता हो। शायद ऐसा करने के लिए कुछ तरीका है? वैकल्पिक रूप से, मैं प्रत्येक देश को थोड़ा अलग तरीके से रंग दूंगा (1 बिट), ताकि वे सभी समान दिखें, लेकिन मैं छवि समन्वय पर रंग की जांच कर सकता हूं और उस तालिका को देख सकता हूं कि रंग किस देश से मेल खाता है सेवा मेरे। हालांकि मैं आपको टिप्पणी करने का समय लेने की सराहना करता हूं, शायद कोई और अधिक सहायक होने का प्रयास कर सकता है? – r3mo

+0

[छवि के क्लिक करने योग्य क्षेत्र] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/16670774/clickable-area-of-image) – lukle

उत्तर

29

यहाँ कैसे मैं एक ऐसी ही समस्या हल है।

सबसे पहले उस छवि को डुप्लिकेट करें जिसे आप छवि मानचित्र के रूप में उपयोग करना चाहते हैं और प्रत्येक अनुभाग को रंग दें। कहने की जरूरत नहीं है, प्रत्येक खंड के लिए एक अलग रंग: डी। फिर अपने लेआउट में दो छवि दृश्य बनाएं। पहली बार पृष्ठभूमि को उस छवि के रूप में सेट करें जिसे आप स्क्रीन पर प्रदर्शित करना चाहते हैं और दूसरे की पृष्ठभूमि में रंगीन रंग के रूप में सेट करें।

फिर दूसरी छवि दृश्य की अदृश्यता को अदृश्य में सेट करें। यदि आप इस बिंदु पर प्रोग्राम चलाते हैं तो आपको उस छवि को देखना चाहिए जिसे आप प्रदर्शित करना चाहते हैं। फिर ऑनटच श्रोता का उपयोग करें और पिक्सेल का रंग प्राप्त करें जहां आपने स्पर्श किया था। रंग रंगीन छवि के अनुरूप होगा।

निम्नलिखित प्राप्त करें टूल विधि को स्पर्श ईवेंट के एक्स और वाई निर्देशांक पारित करने की आवश्यकता होगी। 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); 
} 

आशा है कि यह आपके लिए कुछ मदद की थी :)।

+0

क्या आप इस विधि को लागू करने वाले किसी भी ट्यूटोरियल के बारे में जानते हैं, या कुछ नमूना कोड उपलब्ध हैं? – Kgrover

+0

Config.RGB_565 के साथ काम नहीं करेगा, इसके साथ काम किया: Bitmap.Config.ARGB_8888 – Guy

+1

@scotty आपको कैसे पता चला कि हॉट स्पॉट छवि में कितने हॉट स्पॉट हैं। –

2

मैंने स्कॉटी जैसे मास्क के साथ ऐसा किया, लेकिन मैं और अधिक समस्याओं में भाग गया। असल में GetPixel द्वारा लौटाए गए रंग मास्क फ़ाइल की तुलना में थोड़ा अलग थे। क्या मैंने किया था विकलांग स्केलिंग के साथ और इस तरह पूर्ण रंग विकल्पों के साथ स्मृति में मुखौटा लोड करने के लिए किया गया था:

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

और उसके बाद:

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

तो मैं इस तरह बढ़ाया छवि से coords ऊपर देखा मैंने mask.getPixel (मूल, मूल) लागू किया। यह केवल तब काम करता है जब छवि एंड्रॉइड के साथ स्केल की जाती है: ImageView के अंदर scaleType = "fitXY" अन्यथा कॉर्ड बंद हैं।

1

मैंने क्लाउडunderवर के जवाब का पालन किया लेकिन अभी भी एक क्षेत्र में पिक्सेल रंग की स्थिरता के साथ समस्याएं थीं। आखिरकार मेरे लिए क्या काम करना है यह सुनिश्चित करना है कि मैं मास्क के लिए अनुक्रमित रंग के साथ एक पीएनजी छवि का उपयोग करता हूं। मेरे मामले में मैंने वेब अनुकूलित पैलेट (216 रंग) का उपयोग किया और यह सुनिश्चित किया कि मेरे द्वारा चुने गए किसी भी रंग उस पैलेट से मूल्य थे। एक बार जब मैंने यह परिवर्तन किया, तो मुझे पूरे क्षेत्र में एक ही रंग का मूल्य मिला।

2

मैंने कोशिश नहीं की है, लेकिन this बहुत ही आशाजनक दिखता है।

मैं अपनी परियोजना में इसे आजमाने की कोशिश कर रहा हूं, मुझे उम्मीद है कि यह आपके लिए काम करेगा।

यह लड़का मूल रूप से चुटकी ज़ूम और ड्रैग के साथ droid में HTML Tag Map अनुकरण करने की कोशिश कर रहा है।

संबंधित मुद्दे