2016-02-25 8 views
14

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

+1

आप पूरे वेक्टर टिंट कर सकते हैं (अपनी पसंद के रंग के साथ R.color.headPink बदल), लेकिन एक नहीं पथ घटकों – Blackbelt

उत्तर

1

उपयोग यह आपके वेक्टर drawable

VectorChildFinder vector = new VectorChildFinder(this, R.drawable.my_vector, imageView); 

VectorDrawableCompat.VFullPath path1 = vector.findPathByName("path1"); 
path1.setFillColor(Color.RED); 

लाइब्रेरी में एक पथ रंग बदलने के लिए यहाँ है: https://github.com/devsideal/VectorChildFinder

31

पूरे वेक्टर का रंग सेटटिंट का उपयोग करके बदला जा सकता है।

DrawableCompat.setTint(myImageView.getDrawable(), ContextCompat.getColor(context, R.color.another_nice_color)); 

नोट:: myImageView.getDrawable() अगर वेक्टर drawable NullPointerException देता

<ImageView 
    android:id="@+id/myImageView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:tint="@color/my_nice_color" 
    android:src="@drawable/ic_my_drawable" 
    android:scaleType="fitCenter" /> 

फिर अपनी छवि के रंग बदलने के लिए:

आप इस रूप में अपने लेआउट फ़ाइल में अपने imageView स्थापित करने के लिए है पृष्ठभूमि के रूप में छवि देखें पर सेट है।

+2

इस पूरे drawable को टिंट सेट नहीं लेकिन की एक विशिष्ट पथ वेक्टर खींचने योग्य। – suku

+1

'एंड्रॉइड:' एंड्रॉइड सेट करने के बाद टिंट' सेट किया जाना चाहिए: src' – rupinderjeet

+1

कमाल! धन्यवाद। – tinyCoder

0

के रूप में इस पोस्ट https://stackoverflow.com/a/32007436/4969047

आप में @Eyal द्वारा कहा गया परिवर्तन रनटाइम पर अलग-अलग पथ का रंग नहीं कर सकते। VectorDrawableCompat के स्रोत कोड को देखते हुए, केवल विधि नाम से आंतरिक तत्व को बेनकाब करने के getTargetByName जो VectorDrawableCompat के भीतरी निजी राज्य वर्ग VectorDrawableCompatState में मौजूद है।

चूंकि यह एक पैकेज निजी (डिफ़ॉल्ट) है - आप इसका उपयोग नहीं कर सकते (जब तक आप reflection का उपयोग नहीं करते)।

+1

@ शुब्राल, क्या आप कृपया कोड के साथ विस्तार से बता सकते हैं कि इसे प्राप्त करने के लिए प्रतिबिंब का उपयोग कैसे किया जा सकता है? इसमें समय लग सकता है लेकिन लोगों के भार में मदद मिलेगी। – suku

0

इस अन्य प्रश्न पर मेरा उत्तर देखें: https://stackoverflow.com/a/38418049/1335438

थीम का उपयोग करके और पथ को पैरामीटर करने के लिए इसे गतिशील रूप से सेट करने में सक्षम होने के लिए इसका प्रबंधन करना एक अच्छा विचार है।

4

आप निम्नतर API में रंग बदलने के लिए getActivity के स्थान पर टुकड़ा

int myVectorColor = ContextCompat.getColor(getActivity(), R.color.colorBlack); 
        myButton.getIcon().setColorFilter(myVectorColor, PorterDuff.Mode.SRC_IN); 

में वेक्टर रंग बदलने के लिए आप गतिविधि में वेक्टर रंग बदलने के लिए MainActivity.this का उपयोग करना चाहिए इस विधि का उपयोग कर सकते हैं

1

आप प्रतिबिंब का उपयोग किए बिना रनटाइम पर व्यक्तिगत पथ का रंग बदल सकता है।

वेक्टरमास्टर वेक्टर ड्रॉबल्स पर गतिशील नियंत्रण प्रस्तुत करता है। इस लाइब्रेरी का उपयोग करते हुए वेक्टर ड्रायवर के प्रत्येक पहलू को गतिशील रूप से नियंत्रित किया जा सकता है (जावा इंस्टेंस के माध्यम से)।

बस अपने एप्लिकेशन की build.gradle

dependencies { 
    compile 'com.sdsmdg.harjot:vectormaster:1.0.9' 
} 

आपके मामले में में निम्नलिखित निर्भरता को जोड़ने आप एक सरल रंग बदलने की जरूरत है:

वेक्टर उदाहरण: your_vector।एक्सएमएल

<vector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:width="24dp" 
    android:height="24dp" 
    android:viewportWidth="24.0" 
    android:viewportHeight="24.0"> 
<path 
    android:name="outline" 
    android:pathData="M20.84,4..." 
    android:strokeColor="#5D5D5D" 
    android:fillColor="#00000000" 
    android:strokeWidth="2"/> 

एक्सएमएल:

<com.sdsmdg.harjot.vectormaster.VectorMasterView 
    android:id="@+id/your_vector" 
    android:layout_width="150dp" 
    android:layout_height="150dp" 
    app:vector_src="@drawable/your_drawable" /> 

जावा:

VectorMasterView heartVector = (VectorMasterView) 
findViewById(R.id.your_drawable); 

// find the correct path using name 
PathModel outline = heartVector.getPathModelByName("outline"); 

// set the stroke color 
outline.setStrokeColor(Color.parseColor("#ED4337")); 

// set the fill color (if fill color is not set or is TRANSPARENT, then no fill is drawn) 
outline.setFillColor(Color.parseColor("#ED4337")); 

से: https://github.com/harjot-oberai/VectorMaster, एमआईटी के अंतर्गत लाइसेंस।

अब आपके पास वेक्टर ड्रॉबल्स पर पूर्ण नियंत्रण है।

0

एक ही काम करना के कई तरीके हैं, लेकिन यह दोनों वेक्टर ड्रॉएबल लिए काम करता है साथ ही एसवीजी (स्थानीय/नेटवर्क)।

imageView.setColorFilter(ContextCompat.getColor(context, 
R.color.headPink), android.graphics.PorterDuff.Mode.SRC_IN); 

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