2013-03-28 8 views
6

एक ऐप में मैं विकसित कर रहा हूं मैं प्रोग्रामिंग रूप से ImageButton बनाने की कोशिश कर रहा हूं जो चयनित ImageButton की एक प्रति है, लेकिन छवि को अलग तरीके से रंगीन किया गया है, चलिए लाल कहें।अस्थायी रूप से परिवर्तनीय रंग बदलना

अगर मैं का उपयोग PowerDuff.Mode.MULTIPLY:

clonebutton.getDrawable().setColorFilter(0xFFFF0000,Mode.MULTIPLY); 

फिर भी मूल ImageButton लाल करने के लिए अपने रंग बदल जाता है के बाद से वे एक ही drawable साझा करें। क्या दो अलग-अलग drawables का उपयोग किए बिना केवल क्लोनबटन पर फ़िल्टर लागू करने का कोई तरीका है? उदाहरण के लिए drawable संपादित किए बिना क्लोनबटन के शीर्ष पर रंगीन परत डालने के किसी भी तरीके से संभव है?

Drawable d = swipebutton.getDrawable(); 
d.mutate(); 
d.setColorFilter(0xFFFF0000,Mode.MULTIPLY); 
swipebutton.setImageDrawable(d); 

यह अन्य views करने के लिए अपने drawable के राज्य साझा करने के लिए मेरी clonebutton से बचाता है:

अद्यतन मैं परिवर्तनशील रूप में drawable निर्धारित किया है।

उत्तर

13
Drawable buttonBackground = clonebutton.getDrawable(); 
buttonBackground = buttonBackground.mutate(); 
buttonBackground.setColorFilter(0xFFFF0000,Mode.MULTIPLY); 

नीचे कोड ले इस drawable परिवर्तनशील करें। इस ऑपरेशन को उलट नहीं किया जा सकता है। उत्परिवर्तनीय ड्राइटेबल को किसी अन्य ड्रायबल के साथ अपने राज्य को साझा नहीं करने की गारंटी है। यह विशेष रूप से तब उपयोगी होता है जब आपको संसाधनों से लोड किए गए आरेखण गुण संशोधित करने की आवश्यकता होती है। डिफ़ॉल्ट रूप से, सभी ड्रॉबल्स उसी संसाधन से लोड किए गए उदाहरण एक सामान्य स्थिति साझा करते हैं; यदि आप एक उदाहरण की स्थिति को संशोधित करते हैं, तो अन्य सभी उदाहरणों को समान संशोधन प्राप्त होगा। एक म्यूटेबल ड्रायबल पर इस विधि को कॉल करना का कोई प्रभाव नहीं होगा।

+0

बटन के लिए सामान्य एंड्रोइड ड्रायबल साझा करता है यह बेकार ढंग से काम करता है! – Vektor88

+0

उत्तर इतना तेज आया कि मैं अपनी कम प्रतिष्ठा के कारण उस पल में इसे स्वीकार नहीं कर सका, लेकिन यह निश्चित रूप से काम करता है! – Vektor88

+0

:) ........ कोई चिंता नहीं – Triode

0
Drawable d=clonebutton.getDrawable() 
d.setColorFilter(0xFFFF0000,Mode.MULTIPLY); 
clonebutton.setDrawable(d); 

इस प्रयास करें: या के रूप में अपने जरूरत के अनुसार

switch(v.getId()) 
{ 
case R.id.bt1: 
    Drawable d=b11.getBackground(); 
    d.setColorFilter(Color.CYAN,PorterDuff.Mode.MULTIPLY); 

    b11.setBackgroundDrawable(d); 
    b12.setBackgroundResource(android.R.drawable.btn_default); 
break; 

case R.id.bt2: 
//b2.getBackground().setColorFilter(Color.CYAN,PorterDuff.Mode.MULTIPLY); 
Drawable dd=b12.getBackground(); 
dd.setColorFilter(Color.CYAN,PorterDuff.Mode.MULTIPLY); 

b12.setBackgroundDrawable(dd); 
b11.setBackgroundResource(android.R.drawable.btn_default); 
break; 
} 

switching color of buttons after onclick

+0

यह काम नहीं करेगा क्योंकि संदर्भित ड्रायबल समान है। – Vektor88

+0

आपने दूसरे कोड की जांच की है क्योंकि उसने मेरे लिए काम किया है –

+0

मेरे मामले में मैं ड्रॉइंग को रंगीन बनाना चाहता हूं, न कि पृष्ठभूमि। दो बटन समान ड्रॉइंग साझा करते हैं लेकिन एक ही पृष्ठभूमि नहीं हैं और यह बताता है कि यह क्यों काम करता है, लेकिन यह नहीं है कि मैं – Vektor88

1

लॉलीपॉप पर आपको इस प्रोग्रामेटिक, यानी रंगफिल्टर, बिल्कुल नहीं करना है, अगर आप नहीं चाहते हैं। आप इसे एक्सएमएल ड्रायबल पर टिंट सेट करके कर सकते हैं।

<?xml version="1.0" encoding="utf-8"?> 
<bitmap 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/ic_back" 
    android:tint="@color/red_tint"/> 

अगर आप रंग की एक unlimiited संख्या है काम नहीं कर सकते लेकिन अगर वे सीमित हैं यह एक बहुत अच्छा विकल्प है। Check out my blog post for more information

+0

महान उत्तर मैं पहले से ही यह कोशिश कर रहा था लेकिन यह काम नहीं किया क्योंकि मैंने '# ff000000' के बजाय' # 000' का उपयोग किया था।लॉलीपॉप में इस attibute की अनुमति है भी दस्तावेज नहीं है। उन्हें यह जोड़ना चाहिए। – rekire

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