2012-01-17 11 views
23

एंड्रॉइड 3.0 से clipPath() विधि हार्डवेयर त्वरण के साथ डिवाइस में अब समर्थित नहीं है। (अधिक जानकारी के लिए यह article पढ़ें)।Canvas.clipPath() के आसपास काम करें जो एंड्रॉइड में समर्थित नहीं है

मैं कैनवास के साथ काम कर रहा हूं और मुझे गोलाकार छवि खींचने की आवश्यकता है। मैं यह कैसे कर सकता हूं के बारे में कोई विचार?

* मैं हार्डवेयर त्वरण को बंद नहीं कर सकता, मैं अन्य समाधान की तलाश में हूं।

उत्तर: आपके उत्तर के लिए Tnx @Malcolm। मुझे एक अच्छा उदाहरण मिला जो this technique प्रदर्शित करता है, यह मूल रूप से एक मुखौटा है।

उत्तर

24

Canvas.clipPath() हार्डवेयर त्वरण के साथ समर्थन एपीआई 18 के बाद से पुन: उत्पादित किया गया है।

समस्या को हल करने के लिए setLayerType(View.LAYER_TYPE_SOFTWARE, null) बुला रहा है केवल जब तुम से एपीआई पर चल रहे हैं 11 17 का सबसे अच्छा तरीका:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2 
     && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    setLayerType(LAYER_TYPE_SOFTWARE, null); 
} 

मैं भी एक कोशिश पकड़ ब्लॉक के साथ clipPath() कॉल घिरा unpredicted एप्लिकेशन से बचने के लिए दुर्घटनाओं:

if (doClip) { 
    try { 
     canvas.clipPath(clipPath); 
    } catch (UnsupportedOperationException e) { 
     Log.e(TAG, "clipPath() not supported"); 
     doClip = false; 
    } 
} 

वैसे भी, UnsupportedOperationException कभी नहीं एपीआई> = 18.

देखें 01 पर फेंक दिया जाना चाहिए

+0

क्या यह वास्तव में अन्य उत्तर में समान नहीं है, इस तथ्य के संदर्भ में कि एपीआई 18 ने इसके लिए हार्डवेयर समर्थन प्रस्तुत किया है? उत्तरार्द्ध निश्चित रूप से जोड़ा जाना चाहिए। – Malcolm

+0

हां, यह है ... लेकिन मैंने एपीआई स्तर 18 जानकारी, स्पष्टीकरण और कोड उदाहरण जोड़े ... सभी एक संक्षिप्त उत्तर में। – araks

39

clipPath हार्डवेयर त्वरण के साथ केवल एपीआई स्तर 18 और उच्चतर में समर्थित है, एपीआई स्तरों पर 11 से 17 तक इसे बंद करने की आवश्यकता है।

लेख आपको उल्लेख किया है एक सुराग शामिल हैं:

आपका आवेदन इन लापता सुविधाओं या सीमाओं में से किसी से प्रभावित होता है, तो आप बंद हार्डवेयर त्वरण अपने आवेदन की सिर्फ प्रभावित हिस्से के लिए फोन करके चालू कर सकते हैं setLayerType(View.LAYER_TYPE_SOFTWARE, null)। इस तरह, आप अभी भी हर जगह हार्डवेयर acceleratin का लाभ ले सकते हैं। अपने आवेदन में विभिन्न स्तरों पर हार्डवेयर त्वरण को सक्षम और अक्षम करने के तरीके के बारे में अधिक जानकारी के लिए Controlling Hardware Acceleration देखें। कोई

यहाँ मुख्य विचार आवेदन के हिस्से में हार्डवेयर त्वरण निष्क्रिय करने के लिए जहां एपीआई 18. की तुलना में कम स्तर आप एक विशेष दृश्य के लिए यह कर सकते हैं के साथ उपकरणों पर असमर्थित विधियों का उपयोग करने की आवश्यकता है, और भी है पूरे आवेदन के लिए पूरी तरह से इसे बंद करने की जरूरत है।

यदि आप हार्डवेयर त्वरण को बंद नहीं करना चाहते हैं, तो मैं पोर्टर-डफ मोड का उपयोग करने का सुझाव दूंगा। आप इसमें एक सर्कल के साथ बिटमैप बना सकते हैं, फिर अपनी छवि को ऐसे मोड का उपयोग करके कैनवास पर खींचें जो आपकी छवि को मूल सामग्री पर क्लिप करेगा।

+1

हाँ, लेकिन मुझे केवल एक दृश्य मिला, (आमतौर पर कैनवास के साथ काम करते समय आपको यह मिलता है ...) तो मैं इसे बंद नहीं कर सकता, इसलिए मैं समाधान के आसपास काम की तलाश में हूं। –

+0

"यह अब समर्थित नहीं है, यह केवल हार्डवेयर त्वरण के साथ उपलब्ध नहीं है।" यहां डबल-नकारात्मक इस वाक्य को पढ़ने में मुश्किल बनाते हैं। शायद कुछ ऐसा करने के लिए पुनः लिखें: "क्लिपपाथ' केवल हार्डवेयर त्वरण के साथ उपलब्ध है।" –

+0

@LeoAccend आप क्यों नहीं [एक संपादन का सुझाव दें] (http://stackoverflow.com/help/editing) स्वयं? – Malcolm