2012-06-04 17 views
23

का उपयोग कर सभी बटन बदलता है मेरे पास एक स्क्रीन है जहां एकाधिक बटन एक ही पृष्ठभूमि का उपयोग करने योग्य होते हैं। मेरे पास पुन: प्रयोज्य कोड है जो मैं ऑन-टच श्रोता जोड़ने के लिए विभिन्न प्रोजेक्ट्स में उपयोग करता हूं जो एक बटन को स्पर्श करते समय एक ग्रे रंग फ़िल्टर जोड़ता है। यह आमतौर पर ठीक काम करता है, लेकिन इस मामले में जब भी उनमें से कोई दबाया जाता है तो सभी बटन टिंटेड होते हैं।एक ड्रायरेबल में रंग फ़िल्टर जोड़ना एक ही ड्रायबल

नोट::

मैं http://developer.android.com/guide/topics/graphics/2d-graphics.html में व्याख्या के अपने प्रोजेक्ट में प्रत्येक अद्वितीय संसाधन कोई फर्क नहीं पड़ता कि आप के लिए यह दृष्टांत सकते हैं कि कितने विभिन्न वस्तुओं केवल एक राज्य बनाए रख सकते हैं,। उदाहरण के लिए, यदि आप एक ही छवि संसाधन से दो ड्रायबल ऑब्जेक्ट्स को तुरंत चालू करते हैं, तो ड्रायबल्स में से किसी एक के लिए एक संपत्ति (जैसे अल्फा) बदलें, तो यह दूसरे को भी प्रभावित करेगा।

सुझाया गया समाधान एक TweenAnimation का उपयोग करना है, जो रंग फ़िल्टर के साथ काम नहीं कर रहा है।

मैंने Android: Cloning a drawable in order to make a StateListDrawable with filters भी देखा जो drawable.getConstantState()। NewDrawable() का उपयोग करने का सुझाव देता है। यह कोई फर्क नहीं पड़ता है। मैं अनुमान लगा रहा हूं कि जब तक एक ही भौतिक छवि फ़ाइल का उपयोग किया जाता है, तब तक सभी ड्रॉबल्स एक ही संसाधन का उपयोग करके किसी अन्य ड्रायबल में परिवर्तन से प्रभावित होंगे।

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

उत्तर

54

उदाहरण है कि आप के लिए काम करना चाहिए:

Drawable buttonBackground = context.getResources().getDrawable(R.drawable.bg); 
buttonBackground = buttonBackground.mutate(); 

//Set your filter here 
+0

मैं एक ही Drawable और एक MapView पर एक अलग ColorFilter साथ ओवरले का उपयोग एक ही समस्या थी। उत्परिवर्तित(); ठीक कर दिया। धन्यवाद :) –

+8

ध्यान दें कि यह केवल तभी काम करता है जब आप कॉल करने योग्य कहते हैं। यदि आपने एक चर में ड्रॉबल को कैश किया है और उस पर mutate() को कॉल किया है तो वे अभी भी राज्य साझा करेंगे। – Jeremy

+1

मैं इसके साथ पागल हो रहा था, इसने समस्या हल की, बहुत बहुत धन्यवाद! :) –

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