5

के साथ काम नहीं कर रहा है यह कोड बिटमैप के अल्फा चैनल का उपयोग करके एक रंग (अल्फा के साथ) आकार खींचता है।हनीकॉम्ब हार्डवेयर त्वरण setColorFilter

Bitmap alphaMask = bitmap.extractAlpha(); 
Paint paint = new Paint(); 
int color = Color.GRAY; 
... 
paint.setColor(color); 
paint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.DST_IN)); 
... 
canvas.drawBitmap(alphaMask, x, y, paint); 

उदाहरण के लिए, उसे छोड़ दिया बिटमैप लेने के लिए और कैनवास पर आकर्षित की तरह यह सही पर दिखाई देता होगा:

enter image description here

हालांकि, यह हनीकोम्ब पर काम नहीं करता (एंड्रॉयड 3.0) जब हार्डवेयर त्वरण चालू होता है। यह आकार को काले रंग के रूप में खींचता है चाहे कोई फर्क नहीं पड़ता। यह रंग मूल्य को अनदेखा करता है। हालांकि, यह हार्डवेयर त्वरण के साथ आईसीएस (एंड्रॉइड 4.0) पर ठीक काम करता है।

मुझे पता है कि कुछ एपीआई हार्डवेयर त्वरण के साथ समर्थित नहीं हैं, Romain Guy documented here, के तहत क्या ड्राइंग ऑपरेशंस समर्थित हैं?, लेकिन मैं समर्थित नहीं के रूप में वर्णित किसी भी का उपयोग नहीं कर रहा प्रतीत होता है।

इसके अतिरिक्त, ऐसा लगता है कि सेटकॉलरफ़िल्टर को at this post काम करना चाहिए।

क्या मेरे कोड में कुछ ऐसा है जो हनीकॉम में समर्थित नहीं है? कोई कामकाज? मुझे इस मामले में हार्डवेयर त्वरण छोड़ना अच्छा लगेगा।

धन्यवाद

उत्तर

6

वहाँ कैसे एंड्रॉयड 3.0 संभाला alpha8 बिटमैप्स के साथ एक बग था। मुझे इसके लिए बहुत खेद है क्योंकि यह पूरी तरह से मेरी गलती थी। हालांकि यह समस्या एंड्रॉइड 4.0 में तय की गई थी।

दो संभावित कामकाज हैं: - अपने दृश्य पर एक सॉफ्टवेयर परत प्रकार सेट करें - या अपना खुद का बिटमैप बनाएं और इसमें आपको क्या चाहिए। फिर आप हार्डवेयर त्वरित कैनवास के शीर्ष पर इस बिटमैप को खींच सकते हैं।

+0

+1। बहुत अच्छा। हमें छोड़ने और हमें बताने के लिए धन्यवाद! :) – MrGomez

+1

अरे कोई चिंता नहीं, आपने लोगों ने एंड्रॉइड के साथ अद्भुत चीजें की हैं, माफी मांगने की कोई ज़रूरत नहीं है! किसी भी तरह, मैं एक बिटमैप में ड्राइंग करने के मार्ग पर जा रहा था और फिर बिटकमैप को हार्डवेयर त्वरित कैनवास पर खींच रहा था जैसा आपने कहा था। मेरे लिये कार्य करता है! धन्यवाद – cottonBallPaws

+0

@littleFluffyKitty मुझे खुशी है कि यह सब काम कर रहा है। धन्यवाद, @RomainGuy! – MrGomez

4

मेरा मानना ​​है कि सबसे अच्छा जवाब यहाँ रोमेन लड़का से होने जा रहा है। Quoth he:

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

इस कथन को देखते हुए, आप जिस व्यवहार का अनुभव कर रहे हैं वह एक बग है। यह उन मामलों में से एक है जहां contacting the primary developer responsible वास्तव में प्रदान किया जा सकता है कि सबसे अच्छा तकनीकी तय किया जा सकता है।

वह एक वैकल्पिक हल पोस्ट किया था, हालांकि:

मैं कार्यान्वयन और हार्डवेयर रेंडरर जाँच की वर्तमान एक ComposeShader अंदर विभिन्न प्रकार के केवल shaders समर्थन करता है। यह का अर्थ है कि आप ग्रेडियेंट + बिटमैप का उपयोग कर सकते हैं, लेकिन दो बिटमैप्स या दो ग्रेडियेंट्स नहीं कर सकते हैं। ध्यान दें कि हार्डवेयर में चीजों को समर्थित नहीं करने वाले दृश्यों के लिए आप setLayerType(LAYER_TYPE_SOFTWARE, null) का उपयोग को सॉफ़्टवेयर में प्रस्तुत करने के लिए मजबूर कर सकते हैं।

शायद वह हमें सभी को आगे बढ़ाने के लिए यहां पोस्ट करेगा। He did. :)

+0

जानकारी के लिए धन्यवाद। मैंने view.setLayerType (LAYER_TYPE_SOFTWARE, null) को सेट करने का प्रयास किया लेकिन कैनवास ऑन ड्रा() प्राप्त करता है अभी भी हार्डवेयर त्वरित ('canvas.isHardwareAccelerated') है और कोड अभी भी गलत परिणामों में उत्पन्न होता है। ऐसा लगता है कि कैनवास स्वयं हार्डवेयर को तेज नहीं होना चाहिए। – cottonBallPaws

+0

कोई भी जानता है कि कैनवास सॉफ़्टवेयर प्रदान करने का कोई तरीका है या नहीं? – cottonBallPaws

+1

परत प्रकार को सॉफ़्टवेयर पर सेट करें। यदि आपको हार्डवेयर कैनवास मिल रहा है तो आप परत को गलत दृश्य पर सेट कर सकते हैं। –

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