2013-07-09 6 views
14

मैं एक छवि प्रदर्शित करने का तरीका ढूंढ रहा हूं और उपयोगकर्ता ने नेविगेट करने और क्रियाओं को करने के लिए छवि के विभिन्न हिस्सों पर टैप कर रहा हूं।एंड्रॉइड छवि मानचित्र। - एक .svg प्रदर्शित करना और इसे एक छवि मानचित्र (स्पर्श क्षेत्र) के रूप में उपयोग करना

मैं यह देखने के लिए कि कौन से हिस्सों को छुआ गया है, invisible color map का उपयोग करने पर विचार कर रहा था।

लेकिन चूंकि मैं चयनित क्षेत्रों को हाइलाइट करना चाहता हूं, इसलिए मैं वैक्टर का उपयोग करने की सोच रहा था। एसवीजी फ़ाइलों को छवि दृश्य here में प्रस्तुत करने के लिए एक अच्छी लाइब्रेरी है, लेकिन यह स्पर्श को संभाल नहीं पाती है।
क्या वहां कोई पुस्तकालय है जो करता है? या ऐसा करने का कोई स्मार्ट तरीका?

(मैं यह भी this project जाँच की लेकिन यह .svg फ़ाइलों को निगल नहीं है और मेरी वेक्टर छवि हाथ से सभी डेटा को सम्मिलित करने के लिए अब तक बहुत जटिल है)

+0

आईमैज व्यू के शीर्ष पर ओवरले बनाने के बारे में, जो स्पर्श को संभाल सकता है और फिर निर्देशांक का उपयोग कर छवि को हाइलाइट कर सकता है? – blganesh101

+0

यदि मूल रूप से आपको वेबव्यू के आसपास होने पर केवल svgs की आवश्यकता होती है, तो आप घर हैं और डैनब्रू के उत्तर के साथ सूखे हैं? – Tom

उत्तर

12

दिलचस्प बात नहीं! मुझे विश्वास नहीं है कि आप जिन पुस्तकालयों का उल्लेख करते हैं, उनके संयोजन का उपयोग नहीं कर सकते हैं।

मैं सबसे पहले एसवीजी-एंड्रॉइड का उपयोग अपने एसवीजी फ़ाइल में प्रोग्रामेटिक रूप से पढ़ने के लिए करता हूं। एसवीजी-एंड्रॉइड को देखते हुए, ऐसा लगता है कि यह अंतिम उत्पाद को PictureDrawable के रूप में देता है, जो ड्रायबल का उप-वर्ग है।

ठीक बाद एसवीजी एंड्रॉयड एसवीजी ग्राफिक्स संसाधित होना समाप्त, मैं ImageView.setImageDrawable प्रयोग करेंगे PictureDrawable हम सिर्फ उत्पन्न के साथ मुख्य ImageView लोड करने के लिए। तो मैं मूल प्रश्न में जुड़े "Images with Clickable Areas" के कार्यान्वयन के लिए आधार के रूप में उस ImageView का उपयोग करता हूं।

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

शुभकामनाएं!

+0

ओवरले के रूप में दिखाने के लिए अलग-अलग छवियां बनाने के लिए आप एसवीजी को तोड़ सकते हैं, और स्पर्शों को पकड़ने के लिए उनका उपयोग कर सकते हैं। – andy256

+0

संभवतः। एकमात्र चेतावनी यह है कि क्लिक करने योग्य क्षेत्रों को एक और दृश्यमान क्षेत्र को ओवरलैप किए बिना छविव्यू में "लपेटने" के लिए पर्याप्त आयताकार या दूरी तक होना होगा। यह अच्छा होगा अगर छवि के केवल गैर-पारदर्शी भाग क्लिक करने योग्य थे; तो आप निश्चित रूप से ओवरले दृष्टिकोण ले सकते हैं। और यदि संभवतः आप स्पर्श कर रहे पिक्सेल को संसाधित करने के लिए एक छोटी लाइब्रेरी लिखते हैं तो यह शायद करने योग्य है। यह वास्तव में एक छोटी सी छोटी चुनौती होगी, हालांकि शायद तुरंत व्यावहारिक नहीं है। – Brian

+0

getPixel (event.getX(), event.getY()) को कॉल नहीं करना चाहिए और नमूना रंग के अल्फा मान को जांचना चाहिए? (ऑनटोकलिस्टर में) इसके साथ मेरी एकमात्र चिंता यह है कि लगभग 20 टच जोनों के साथ मैं कुछ गंभीर ओवरड्राउ बनाउंगा ... ओवरड्रा को कम करने के लिए प्रत्येक छवि को "बॉन्डिंग-बॉक्स-साइज्ड" वर्गों में काटकर काम कर सकता है, लेकिन मैं सभी को पोजिशन कर रहा हूं सभी differet स्क्रीन घनत्व के साथ उन टुकड़ों में ... सिरदर्द :) – pumpkee

6

अगर इस बात की तरह आप कर रहे हैं सुनिश्चित नहीं हैं के बाद, लेकिन यहाँ एक Android WebView में के क्लिक सक्षम svg एक उदाहरण है:

WebView webView = (WebView) findViewById(R.id.webView1); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.loadUrl("http://www.w3.org/TR/SVG/images/script/script01.svg"); 

यह एक लाल वृत्त है कि आप पर क्लिक कर सकते हैं और चक्र परिवर्तन आकार को दिखाना चाहिए।

यहां वही उदाहरण है जो संपत्ति फ़ोल्डर से लोड किए गए एसवीजी और एक एंड्रॉइड जावास्क्रिप्ट इंटरफ़ेस से उजागर किया गया है ताकि आप अपनी svg फ़ाइल से एंड्रॉइड कोड में कॉलबैक कर सकें।

WebView webView; 

    public class WebAppInterface { 
    /** Show a toast from svg */ 
    @JavascriptInterface 
    public void showToast(String toast) { 
     Toast.makeText(MainActivity.this, toast, Toast.LENGTH_SHORT).show(); 
    } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    webView = (WebView) findViewById(R.id.webView1); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.addJavascriptInterface(new WebAppInterface(), "Android"); 

    String svg = loadSvg(); 
    webView.loadData(svg, "image/svg+xml", "utf-8"); 
    } 

    String loadSvg() { 
    try { 
     BufferedReader input = new BufferedReader(new InputStreamReader(
      getAssets().open("test.svg"))); 
     StringBuffer buf = new StringBuffer(); 
     String s = null; 
     while ((s = input.readLine()) != null) { 
     buf.append(s); 
     buf.append('\n'); 
     } 
     input.close(); 
     return buf.toString(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
    return null; 
    } 

और test.svg फ़ाइल:

<?xml version="1.0" standalone="no"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
    "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg width="6cm" height="5cm" viewBox="0 0 600 500" 
    xmlns="http://www.w3.org/2000/svg" version="1.1"> 
    <desc>Example script01 - invoke an ECMAScript function from an onclick event 
    </desc> 
    <!-- ECMAScript to change the radius with each click --> 
    <script type="application/ecmascript"> <![CDATA[ 
    function circle_click(evt) { 
     Android.showToast("Hello from SVG"); 
     var circle = evt.target; 
     var currentRadius = circle.getAttribute("r"); 
     if (currentRadius == 100) 
     circle.setAttribute("r", currentRadius*2); 
     else 
     circle.setAttribute("r", currentRadius*0.5); 
    } 
    ]]> </script> 

    <!-- Outline the drawing area with a blue line --> 
    <rect x="1" y="1" width="598" height="498" fill="none" stroke="blue"/> 

    <!-- Act on each click event --> 
    <circle onclick="circle_click(evt)" cx="300" cy="225" r="100" 
      fill="red"/> 

    <text x="300" y="480" 
     font-family="Verdana" font-size="35" text-anchor="middle"> 
    Click on circle to change its size 
    </text> 
</svg> 
+1

अच्छा रचनात्मक कामकाज! मुझे लगता है कि कॉन को वेबव्यू का उपयोग करने के महंगे ओवरहेड के लिए भुगतान करना पड़ रहा है। – Tom

+1

हाँ, इसकी क्षमता है। आप जावा प्राइमेटिव को जावास्क्रिप्ट पर भी पास कर सकते हैं। शर्मिंदा आप सीधे जावास्क्रिप्ट में कॉल नहीं कर सकते हैं। –

+2

ज़ूम और पैन नियंत्रण के साथ एक svg आधारित मानचित्र पर एक ट्यूटोरियल है: http://www.petercollingridge.co।यूके/इंटरएक्टिव-एसवीजी-घटक/पैन-एंड-ज़ूम-कंट्रोल –

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