मेरी वेक्टर ड्रॉबल स्केलिंग उम्मीद के मुताबिक क्यों नहीं है?


97

मैं अपने एंड्रॉइड ऐप में वेक्टर ड्रॉबल्स का उपयोग करने का प्रयास कर रहा हूं। से http://developer.android.com/training/material/drawables.html (जोर मेरा):

एंड्रॉइड 5.0 (एपीआई स्तर 21) और इसके बाद के संस्करण में, आप वेक्टर ड्रॉबल्स को परिभाषित कर सकते हैं, जो परिभाषा खोए बिना पैमाने पर है।

इस चित्र का उपयोग करना:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="@color/colorPrimary" android:pathData="M14,20A2,2 0 0,1 12,22A2,2 0 0,1 10,20H14M12,2A1,1 0 0,1 13,3V4.08C15.84,4.56 18,7.03 18,10V16L21,19H3L6,16V10C6,7.03 8.16,4.56 11,4.08V3A1,1 0 0,1 12,2Z" />

और यह ImageView:

<ImageView
    android:layout_width="400dp"
    android:layout_height="400dp"
    android:src="@drawable/icon_bell"/>

400dp पर आइकन प्रदर्शित करने का प्रयास करते समय (लार्गिश हाई-रिस सर्पा 2015 में लॉलीपॉप चलाने वाले मोबाइल डिवाइस पर) इस धुंधली छवि का उत्पादन होता है:

blurryBellIcon

वेक्टर ड्रॉबल की परिभाषा में चौड़ाई और ऊंचाई को 200dp में बदलने से 400dp प्रदान किए गए आकार में स्थिति में काफी सुधार होता है। हालाँकि, इसे TextView तत्व (यानी टेक्स्ट के बाईं ओर स्थित आइकन) के लिए एक आकर्षक के रूप में सेट करना अब एक बहुत बड़ा आइकन बनाता है।

मेरे सवाल:

1) वेक्टर ड्रॉबल में चौड़ाई / ऊंचाई विनिर्देश क्यों है? मैंने सोचा कि इनमें से पूरी बात यह है कि वे अपनी परिभाषा में चौड़ाई और ऊँचाई को निरर्थक बना रहे हैं?

2) क्या एक एकल वेक्टर ड्रॉबल का उपयोग करना संभव है जो टेक्स्ट व्यू पर 24dp ड्रॉबल के रूप में काम करता है लेकिन साथ ही साथ बड़ी छवियों का भी उपयोग करने के लिए स्केल करता है? उदाहरण के लिए, मैं विभिन्न आकारों के कई सदिश आकृतियाँ बनाने से कैसे बचूँ और इसके बजाय मेरी प्रदान की गई आवश्यकताओं के लिए कौन-सा पैमाना इस्तेमाल करूँ?

3) मैं चौड़ाई / ऊंचाई विशेषताओं का प्रभावी ढंग से उपयोग कैसे कर सकता हूं और व्यूपोर्टविद / हाइट के साथ क्या अंतर है?

अतिरिक्त जानकारिया:

  • डिवाइस API 22 चला रहा है
  • ग्रैडल संस्करण 1.5.0 के साथ एंड्रॉइड स्टूडियो v1.5.1 का उपयोग करना
  • मैनिफेस्ट संकलन और लक्ष्य स्तर 23, न्यूनतम स्तर 15 है। मैंने भी 21 के स्तर को स्थानांतरित करने की कोशिश की है, लेकिन इससे कोई फर्क नहीं पड़ा।
  • एपीके को घटाकर (न्यूनतम स्तर 21 के साथ) ड्रॉ करने योग्य फ़ोल्डर में एक एकल XML संसाधन दिखाता है। कोई रेखापुंज छवियां उत्पन्न नहीं होती हैं।

केवल स्पष्ट करने के लिए। आप Android स्टूडियो का उपयोग कर रहे हैं? एंड्रॉइड स्टूडियो का कौन सा संस्करण और ग्रेडल प्लगइन का कौन सा संस्करण है? जब मैं एंड्रॉइड स्टूडियो में ड्रा करने योग्य फ़ोल्डर पर राइट क्लिक करता हूं और New -> Vector Assetइसे चुनता हूं तो मेरे ड्रॉ करने योग्य फ़ोल्डर में वेक्टर छवि XML को गिरा देता है। हालाँकि, अगर मैं एपीके को अनलॉक करने के लिए एपीकेटूल का उपयोग करता हूं जो कि निर्मित होता है, तो मैं देखता हूं कि एक्सएमएल फाइलें drawable-anydpi-v21एपीआई 21+ उपकरणों पर सही ढंग से और पैमाने पर हैं। रेखापुंज फ़ाइलों को drawable-<mdpi/hdpi/etc>-v4फ़ोल्डर्स में रखा जाता है और एपीआई 21+ उपकरणों पर उपयोग नहीं किया जाता है (इस तथ्य के आधार पर कि वे सही पैमाने पर हैं)
कोरी चार्लटन

@ कोरी चार्लटन। जिज्ञासु। मैं ग्रैड 1.5.0 के साथ स्टूडियो 1.5.1 का उपयोग कर रहा हूं। न्यूनतम स्तर 21 में बदलने के बाद, एपीके में केवल वही जगह दिखाई देती है जो drawableफ़ोल्डर है। वेक्टर ड्रॉबल xml फ़ाइल में चौड़ाई / ऊँचाई 24dp है। विशेष रूप से 400dp ऊँचाई / चौड़ाई का एक ImageView विशेष रूप से एक खराब स्केल वाली छवि बना रहा है।
क्रिस नाइट

यही मैं उम्मीद करूंगा। एकमात्र कारण जो मैं समाप्त करता हूं, drawable-anydpi-v21वह यह है कि मेरा minSdkVersion21 से कम है। यदि आप minSdkVersion21 से कम पर सेट हैं तो व्यवहार में कोई बदलाव ? XML को किस ओर ले जाना है drawable-anydpi? मैं एक बदलाव की उम्मीद नहीं करूंगा, लेकिन मैं आपकी वेक्टर इमेज को सही ढंग से स्केल करने की उम्मीद करूंगा ...
Cory Charlton

15 तक मिनिमम वर्जन बदलने से आपके जैसा ही परिणाम आता है। drawable-anydpi-v21Mdi / hdpi / etc में विभिन्न rasterized छवियों के साथ एक एकल xml फ़ाइल । फ़ोल्डरों। हालांकि अंतिम परिणाम में कोई बदलाव नहीं किया गया है।
क्रिस नाइट

बहुत ही अजीब ... मैंने आपकी छवि का उपयोग करते हुए अपने एक ऐप को संशोधित किया और यह ठीक काम करता है (मेरे संपादित जवाब देखें)
कोरी चार्लटन

जवाबों:


100

इस मुद्दे के बारे में नई जानकारी यहाँ है:

https://code.google.com/p/android/issues/detail?id=202019

ऐसा लगता है कि उपयोग android:scaleType="fitXY"करने से यह लॉलीपॉप पर सही ढंग से पैमाना बना देगा।

Google इंजीनियर से:

नमस्ते, मुझे बताएं कि यदि छवि को तीव्र बनाने के लिए, तो पैमाना = 'fitXY' आपके लिए एक समाधान हो सकता है।

मार्शमैलो बनाम लॉलीपॉप मार्शमैलो में जोड़े गए एक विशेष स्केलिंग उपचार के कारण है।

साथ ही, आपकी टिप्पणियों के लिए: "सही व्यवहार: गुणवत्ता के नुकसान के बिना वेक्टर ड्रॉबल को मापना चाहिए। इसलिए यदि हम अपने आवेदन में 3 अलग-अलग आकारों में एक ही संपत्ति का उपयोग करना चाहते हैं, तो हमें वेक्टर_ड्राइव करने योग्य नहीं है। अलग-अलग समय के साथ 3 बार। हार्डकोडेड आकार। "

हालांकि मैं पूरी तरह से सहमत हूं कि यह मामला होना चाहिए, वास्तव में, एंड्रॉइड प्लेटफॉर्म में प्रदर्शन की चिंता है कि हम अभी तक आदर्श दुनिया तक नहीं पहुंचे हैं। तो यह वास्तव में बेहतर प्रदर्शन के लिए 3 अलग वेक्टर_ड्राइवेबल.एक्सएमएल का उपयोग करने के लिए अनुशंसित है यदि आप सुनिश्चित हैं कि आप एक ही समय में स्क्रीन पर 3 अलग-अलग आकार खींचना चाहते हैं।

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


27
ठीक है Google, यह बिल्कुल भयानक है कि हमें समान व्यूपोर्ट और रास्तों के समान समरूप ड्रॉ की कॉपी-पेस्ट करनी चाहिए , जिनके केवल अलग-अलग आकार हैं।
मिहा_एक्स ६४

इसने इसे उस डिवाइस पर नियत किया जो मेरा लोगो पिक्सलेटेड दिखा रहा था, लेकिन दूसरी इकाई पर, जहां सब कुछ पहले ठीक था, अब यह गलत पहलू अनुपात है। मुझे समझ नहीं आता कि यह एक समस्या क्यों है, यह एक वेक्टर है! पिक्सेल नहीं! : P
tplive

@ हरीश ज्ञानानी, Android: scaleType = "fitXY" समस्या को हल करता है लेकिन डायनामिक और स्क्वीक आइकनों के बारे में क्या?
मैनुएला

28

1) वेक्टर ड्रॉबल में चौड़ाई / ऊंचाई विनिर्देश क्यों है? मैंने सोचा कि इनमें से पूरी बात यह है कि वे अपनी परिभाषा में चौड़ाई और ऊँचाई को निरर्थक बना रहे हैं?

एसडीके संस्करणों के लिए 21 से कम जहां बिल्ड सिस्टम को रेखापुंज छवियों को उत्पन्न करने की आवश्यकता होती है और उन मामलों में डिफ़ॉल्ट आकार के रूप में जहां आप चौड़ाई / ऊंचाई निर्दिष्ट नहीं करते हैं।

2) क्या एक एकल वेक्टर ड्रॉबल का उपयोग करना संभव है जो टेक्स्ट व्यू पर एक 24dp ड्रॉबल के रूप में काम करता है और साथ ही साथ एक बड़ी स्क्रीन के पास चौड़ाई वाली छवि है?

मुझे विश्वास नहीं है कि यह संभव है अगर आपको 21 से कम एसडीके को लक्षित करने की आवश्यकता है।

3) मैं चौड़ाई / ऊंचाई विशेषताओं का प्रभावी ढंग से उपयोग कैसे कर सकता हूं और व्यूपोर्टविद / हाइट के साथ क्या अंतर है?

दस्तावेज़ीकरण: (वास्तव में अभी बहुत उपयोगी नहीं है कि मैं इसे फिर से पढ़ूं ...)

android:width

उपयोग करने योग्य की आंतरिक चौड़ाई को परिभाषित करने के लिए उपयोग किया जाता है। यह सभी आयाम इकाइयों का समर्थन करता है, आमतौर पर डीपी के साथ निर्दिष्ट होता है।

android:height

आंतरिक ऊंचाई को परिभाषित करने के लिए उपयोग किया जाता है। यह सभी आयाम इकाइयों का समर्थन करता है, आमतौर पर डीपी के साथ निर्दिष्ट होता है।

android:viewportWidth

व्यूपोर्ट स्पेस की चौड़ाई को परिभाषित करने के लिए उपयोग किया जाता है। व्यूपोर्ट मूल रूप से वर्चुअल कैनवस है जहां रास्ते तैयार किए जाते हैं।

android:viewportHeight

व्यूपोर्ट स्पेस की ऊंचाई को परिभाषित करने के लिए उपयोग किया जाता है। व्यूपोर्ट मूल रूप से वर्चुअल कैनवस है जहां रास्ते तैयार किए जाते हैं।

अधिक प्रलेखन:

Android 4.4 (API स्तर 20) और निचला वेक्टर ड्राअबल्स का समर्थन नहीं करता है। यदि आपका न्यूनतम एपीआई स्तर इन एपीआई स्तरों में से एक पर सेट है, तो वेक्टर एसेट स्टूडियो भी ग्रेडल को निर्देश देता है कि पिछड़े-अनुकूलता के लिए वेक्टर की रोस्टर छवियों को उत्पन्न करें। आप वेक्टर संपत्तियों को Drawableजावा कोड या @drawableXML कोड में देख सकते हैं; जब आपका ऐप चलता है, तो संबंधित वेक्टर या रेखापुंज छवि एपीआई स्तर के आधार पर स्वचालित रूप से प्रदर्शित होती है।


संपादित करें: कुछ अजीब चल रहा है। यहाँ एमुलेटर एसडीके संस्करण 23 (लॉलीपॉप + टेस्ट डिवाइस अभी मृत है ...) में मेरे परिणाम हैं:

6.x पर अच्छी घंटी

और एमुलेटर एसडीके संस्करण 21 में:

5.x पर क्रैपी घंटियाँ


1
धन्यवाद Cory, मैंने उस प्रलेखन को देखा था और यह भी बहुत उपयोगी नहीं पाया। मेरा डिवाइस लॉलीपॉप (v22) है और फिर भी मैं वेक्टर को अच्छी तरह से स्केल करने के लिए ग्राफिक नहीं प्राप्त कर सकता हूं, वेक्टर ड्रॉबल में निर्दिष्ट 24dp से ऊपर, भले ही Heigh / वजन बिल्कुल ImageView में निर्दिष्ट हो या नहीं। मैंने लक्ष्य और संकलित स्तर 23 और न्यूनतम स्तर 21 के साथ एक अभिव्यक्ति का परीक्षण किया है फिर भी यह मेरे वेक्टर ड्रॉबल को सुचारू रूप से अपक्षय नहीं करेगा, मेरे बिना ड्रॉबल में चौड़ाई / ऊंचाई को बदल देगा। मैं वास्तव में एक से अधिक ड्रॉइबल्स नहीं बनाना चाहता, जिसका एकमात्र अंतर ऊंचाई / चौड़ाई है!
क्रिस नाइट

1
पुष्टि के लिए धन्यवाद और वास्तव में आपकी मदद की सराहना करते हैं। जैसा कि आपने प्रदर्शन किया है, यह स्पष्ट रूप से काम करना चाहिए जैसा कि मुझे उम्मीद है। आपके सटीक कोड का उपयोग करने से वही परिणाम प्राप्त होता है जैसा कि मूल रूप से मेरे पास था। निराशा होती!
क्रिस नाइट

1
अद्यतन: एपीआई 22 के साथ एमुलेटर के खिलाफ मेरा कोड चला गया और मुझे अभी भी वही परिणाम मिला है। एपीआई 23 के साथ एमुलेटर के खिलाफ मेरा कोड और, टाडा!, यह काम करता है। लगता है कि अपसंस्कृति केवल एपीआई 23+ उपकरणों पर काम कर रही है। लक्ष्य SDK संस्करण को बदलने की कोशिश की लेकिन इससे कोई फर्क नहीं पड़ा।
क्रिस नाइट

क्या आपको इस मुद्दे का हल मिला?
dazza5000

@corycharlton को हटाना width height viewport heightऔर widthसे ठीक है xml?
विन्नुसुरस

9

AppCompat 23.2 एंड्रॉइड 2.1 और इसके बाद के संस्करण चलाने वाले सभी उपकरणों के लिए वेक्टर ड्रॉबल्स का परिचय देता है। वेक्टर ड्रिबल की XML फ़ाइल में निर्दिष्ट चौड़ाई / ऊँचाई के बावजूद, छवियाँ सही ढंग से मापी जाती हैं। दुर्भाग्य से, इस कार्यान्वयन का उपयोग एपीआई स्तर 21 और उससे ऊपर (मूल कार्यान्वयन के पक्ष में) में नहीं किया जाता है।

अच्छी खबर यह है कि हम AppCompat को 21 और 22 के एपीआई स्तरों पर इसके कार्यान्वयन के लिए बाध्य कर सकते हैं। बुरी खबर यह है कि हमें ऐसा करने के लिए प्रतिबिंब का उपयोग करना होगा।

सबसे पहले, सुनिश्चित करें कि आप AppCompat के नवीनतम संस्करण का उपयोग कर रहे हैं, और आपने नया वेक्टर कार्यान्वयन सक्षम किया है:

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

dependencies {
    compile 'com.android.support:appcompat-v7:23.2.0'
}

फिर, useCompatVectorIfNeeded();अपने आवेदन के onCreate पर कॉल करें ():

private void useCompatVectorIfNeeded() {
    int sdkInt = Build.VERSION.SDK_INT;
    if (sdkInt == 21 || sdkInt == 22) { //vector drawables scale correctly in API level 23
        try {
            AppCompatDrawableManager drawableManager = AppCompatDrawableManager.get();
            Class<?> inflateDelegateClass = Class.forName("android.support.v7.widget.AppCompatDrawableManager$InflateDelegate");
            Class<?> vdcInflateDelegateClass = Class.forName("android.support.v7.widget.AppCompatDrawableManager$VdcInflateDelegate");

            Constructor<?> constructor = vdcInflateDelegateClass.getDeclaredConstructor();
            constructor.setAccessible(true);
            Object vdcInflateDelegate = constructor.newInstance();

            Class<?> args[] = {String.class, inflateDelegateClass};
            Method addDelegate = AppCompatDrawableManager.class.getDeclaredMethod("addDelegate", args);
            addDelegate.setAccessible(true);
            addDelegate.invoke(drawableManager, "vector", vdcInflateDelegate);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

अंत में, सुनिश्चित करें कि आप अपने ImageView की छवि सेट करने के app:srcCompatबजाय उपयोग कर रहे हैं android:src:

<ImageView
    android:layout_width="400dp"
    android:layout_height="400dp"
    app:srcCompat="@drawable/icon_bell"/>

आपके वेक्टर ड्रॉबल्स को अब सही ढंग से मापना चाहिए!


अच्छा दृष्टिकोण, लेकिन, AppCompat 25.4 (और शायद पहले) एक लिंट त्रुटि देता है "केवल उसी पुस्तकालय समूह से बुलाया जा सकता है"। मेरे द्वारा उपयोग किए जा रहे निर्माण उपकरण अभी भी इसे बनाने देते हैं, लेकिन मुझे यकीन नहीं है कि रनटाइम परिणाम हैं। परीक्षण के बारे में।
androidguy

केवल एक ही लाइब्रेरी समूह से कॉल किया जा सकता है, इस त्रुटि को जोड़कर इसे हटा दें: lintOptions {अक्षम 'RestrictedApi'}
Saeed US

6

1) वेक्टर ड्रॉबल में चौड़ाई / ऊंचाई विनिर्देश क्यों है? मैंने सोचा कि इनमें से पूरी बात यह है कि वे अपनी परिभाषा में चौड़ाई और ऊँचाई को निरर्थक बना रहे हैं?

यदि आप इसे लेआउट दृश्य में परिभाषित नहीं करते हैं तो यह वेक्टर का केवल डिफ़ॉल्ट आकार है। (यानी आप अपने चित्र की ऊंचाई और चौड़ाई के लिए रैप कंटेंट का उपयोग करते हैं)

2) क्या एक एकल वेक्टर ड्रॉबल का उपयोग करना संभव है जो टेक्स्ट व्यू पर एक 24dp ड्रॉबल के रूप में काम करता है और साथ ही साथ एक बड़ी स्क्रीन के पास चौड़ाई वाली छवि है?

हां, यह संभव है और मुझे तब तक आकार बदलने में कोई समस्या नहीं है जब तक कि रनिंग डिवाइस लॉलीपॉप या उच्चतर का उपयोग कर रही है। पिछले एपीआई में, जब आप ऐप बनाते हैं तो वेक्टर विभिन्न स्क्रीन आकारों के लिए pngs में बदल जाता है।

3) मैं चौड़ाई / ऊंचाई विशेषताओं का प्रभावी ढंग से उपयोग कैसे कर सकता हूं और व्यूपोर्टविद / हाइट के साथ क्या अंतर है?

यह प्रभावित करता है कि आपके वेक्टर के आसपास की जगह का उपयोग कैसे किया जाता है। यानी आप व्यूपोर्ट के अंदर वेक्टर के "गुरुत्व" को बदलने के लिए इसका उपयोग कर सकते हैं, वेक्टर को एक डिफ़ॉल्ट मार्जिन बना सकते हैं, वेक्टर के कुछ हिस्सों को व्यूपोर्ट से बाहर छोड़ सकते हैं, आदि ... आम तौर पर, आप बस उन्हें उसी पर सेट करते हैं। आकार।


धन्यवाद अमीरा मुझे इसमें दिलचस्पी होगी कि आपने एक ही ड्रॉबल का उपयोग करके कई प्रदान किए गए आकारों को कैसे पूरा किया। एक 24dp ड्रॉबल (परीक्षण प्रयोजनों के लिए) का उपयोग करते हुए मैंने अपना इमेज व्यू बदल दिया है और निर्दिष्ट चौड़ाई और ऊंचाई 400dp की हो गई है और अपने लॉलीपॉप डिवाइस (v22) पर चल रहा है, फिर भी यह अभी भी खराब रूप से प्रतिपादन कर रहा है, जैसे कि वेक्टर छवि के बजाय रैस्टर्ड अपघटित छवि। इसके अलावा v23 और न्यूनतम संस्करण 21 के खिलाफ लक्ष्य और संकलन करने के लिए मेरी उपस्थिति को बदल दिया। कोई अंतर नहीं।
क्रिस नाइट

इस स्थिति में आपको केवल अपने वेक्टर ड्रा में सबसे बड़े आकार का उपयोग करने की आवश्यकता होगी और फिर अपने टेक्स्ट दृश्य में 24dp आकार निर्दिष्ट करें।
अमीरु

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

4

मैं अपनी समस्या को हल करता हूं बस वेक्टर छवि का आकार बदलें। पहले यह संसाधन जैसा था:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="300"
    android:viewportWidth="300">

और मैंने इसे 150dp (इस वेक्टर संसाधन के साथ लेआउट में ImageView का आकार) में बदल दिया है:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="150dp"
    android:height="150dp"
    android:viewportHeight="300"
    android:viewportWidth="300">

यह मेरे लिए काम कर रहा है।


धन्यवाद, यह मेरे टैबलेट पर समस्या को हल करने के लिए पर्याप्त है जहां यह पिक्सेलित दिखाई दिया।
user2342558

3

मैं इन तरीकों की कोशिश करता हूं, लेकिन दुर्भाग्य से, उनमें से किसी ने भी काम नहीं किया। मैं कोशिश fitXYमें ImageView, मैं उपयोग कर प्रयास करें app:srcCompatलेकिन फिर भी इसका इस्तेमाल नहीं कर सकते हैं। लेकिन मुझे एक मुश्किल तरीका मिला:

backgroundअपने की Drawable को सेट करें ImageView

लेकिन इस तरह से बिंदु दृश्य आयाम है। यदि आपके ImageViewगलत आयाम हैं, तो ड्रॉबल स्ट्रेच हो जाता है। आपको पूर्व-लॉलीपॉप संस्करणों में इसे नियंत्रित करना होगा या कुछ दृश्यों का उपयोग करना होगा PercentRelativeLayout

आशा है कि यह उपयोगी है।


2

पहले : आयात करने के लिए svg आयात करें: (( https://www.learn2crack.com/2016/02/android-studio-sv.html.html )

1-ड्रा करने योग्य फ़ोल्डर पर राइट क्लिक करें नया -> वेक्टर एसेट चुनें

यहां छवि विवरण दर्ज करें

2- वेक्टर एसेट स्टूडियो आपको इनबिल्ट मटेरियल आइकन या अपनी खुद की लोकल svg फाइल चुनने का विकल्प प्रदान करता है। यदि आवश्यक हो तो आप डिफ़ॉल्ट आकार को ओवरराइड कर सकते हैं।

यहां छवि विवरण दर्ज करें

दूसरा : यदि आप Android API 7+ का समर्थन चाहते हैं, तो आपको Android समर्थन लाइब्रेरी रिकॉर्डिंग (( https://stackoverflow.com/a/44713221/1140304 ) का उपयोग करना होगा)

1- जोड़ें

vectorDrawables.useSupportLibrary = true

अपनी build.gradle फ़ाइल के लिए।

अपने लेआउट में 2-उपयोग नामस्थान जिसमें imageView है:

xmlns:app="http://schemas.android.com/apk/res-auto"

तीसरा : Android के साथ imageView सेट करें: scaleType = "fitXY" और ऐप का उपयोग करें: srcCompat

 <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY"
        app:srcCompat="@drawable/ic_menu" />

चौथा : यदि आप जावा कोड में svg सेट करना चाहते हैं तो आपको ऑनक्रिएट मेथड पर नीचे की पंक्ति को जोड़ना होगा

 @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

क्या आपका समाधान एपीआई 21 और इसके बाद के संस्करण पर काम करता है? user3210008 ऊपर उल्लेख किया है कि कार्यान्वयन एपीआई 21 और इसके बाद के संस्करण पर उपयोग नहीं किया गया है।
AJW

2

मेरे लिए वे कारण जिनकी वजह से वैक्टर को पीएनजी में परिवर्तित किया गया android:fillType="evenodd", मेरे वेक्टर ड्रॉबल में विशेषता थी । जब मैंने अपने ड्रॉबल में इस विशेषता की सभी घटनाओं को हटा दिया ( nonzeroतो वेक्टर पर लागू डिफ़ॉल्ट भरण प्रकार), तो अगली बार जब एप्लिकेशन बनाया गया तो सब कुछ ठीक था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.