2016-12-15 8 views
6

एंड्रॉइड में मैंने कुछ लेख पढ़े हैं कि कैसे ड्रॉबल्स स्थिर स्थिति साझा करते हैं। इसलिए यदि आप एक ड्रॉइंग में बदलाव करते हैं तो यह सभी बिटमैप्स को प्रभावित करता है। उदाहरण के लिए कहें कि आपके पास स्टार ड्रॉबल्स की एक सूची है। एक पर अल्फा बदलने से सभी स्टार ड्रॉबल्स अल्फा बदल जाएंगे। लेकिन आप किसी साझा स्थिति के साथ एक ड्रायबल की अपनी प्रति प्राप्त करने के लिए उत्परिवर्तन का उपयोग कर सकते हैं।एंड्रॉइड ड्रायरेबल - getConstantState.newDrawable() बनाम mutate()

क्या एंड्रॉयड में निम्नलिखित दो कॉल के बीच अंतर है::

Drawable clone = drawable.getConstantState().newDrawable(); 

// vs 

Drawable clone = (Drawable) drawable.getDrawable().mutate(); 

मेरे लिए वे दोनों के रूप में एक drawable क्लोनिंग कर रहे हैं
लेख मैं पढ़ रहा था here

अब मेरे सवाल पर है वे दोनों एक ड्रॉबल लौटते हैं जिसमें कोई साझा राज्य नहीं है। क्या मैं कुछ भूल रहा हूँ ?

+0

आप के साथ ध्यान देंगे 'mutate' कि' क्लोन == drawable' है ' TRUE'। – 4castle

+1

मैं देखता हूं, इसलिए mutate सटीक समान ड्रॉबल है लेकिन साझा स्थिति के बिना। और drawable.getConstantState()। newDrawable(); वास्तव में स्मृति में एक नया खींचने योग्य है, सही? – j2emanue

+0

यह सही है! – 4castle

उत्तर

5

जैसा कि @ 4castle टिप्पणियों में इंगित किया गया है mutate() विधि प्रतिलिपि निरंतर खींचने योग्य राज्य के साथ ड्रायबल का एक ही उदाहरण देता है। डॉक्स का कहना है कि

एक परिवर्तनशील drawable किसी अन्य drawable

तो यह एक ही राज्य के साथ ड्रॉएबल को प्रभावित किए बिना एक drawable बदलने के लिए सुरक्षित है

चलें खेलने के साथ अपने राज्य साझा करने के लिए गारंटी है एक काले रंग की आकृति

<!-- shape.xml --> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
    <solid android:color="@android:color/black" /> 
</shape> 


- इस drawable के साथ
view1.setBackgroundResource(R.drawable.shape); // set black shape as a background 
view1.getBackground().mutate().setTint(Color.CYAN); // change black to cyan 
view2.setBackgroundResource(R.drawable.shape); // set black shape background to second view 


विपरीत विधि newDrawable() है। यह एक नया ड्रॉबल बनाता है लेकिन एक ही स्थिर स्थिति के साथ। जैसे BitmapDrawable.BitmapState को देखो:

@Override 
    public Drawable newDrawable() { 
     return new BitmapDrawable(this, null); 
    } 

परिवर्तन करने के लिए नए drawable वर्तमान drawable को प्रभावित नहीं करेगा, लेकिन एक राज्य बदल जाएगा:

view1.setBackgroundResource(R.drawable.shape); // set black shape as background 
Drawable drawable = view1.getBackground().getConstantState().newDrawable(); 
drawable.setTint(Color.CYAN); // view still black 
view1.setBackground(drawable); // now view is cyan 
view2.setBackgroundResource(R.drawable.shape); // second view is cyan also 
+0

आप महोदय, सही हैं, वही समस्या थी और यह मेरे लिए हल हो गई। धन्यवाद! – apmartin1991

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