स्केलिंग के बिना लेयर-लिस्ट में वेक्टर को कैसे केंद्र में रखा जा सकता है


102

मैं एक उपयोग करने का प्रयास कर रहा हूँ VectorDrawableएक में LayerListवेक्टर स्केलिंग के बिना। उदाहरण के लिए:

<layer-list>
    <item android:drawable="@color/grid_item_activated"/>
    <item android:gravity="center" android:drawable="@drawable/ic_check_white_48dp"/>
</layer-list>

के ic_check_white_48dpरूप में परिभाषित drawable आईडी:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="48dp"
        android:height="48dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="#FFFFFFFF"
        android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
</vector>

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

मैं वांछित प्रभाव उत्पन्न कर सकता हूं यदि मैं प्रत्येक घनत्व के लिए PNGs के साथ सदिश आरेख को प्रतिस्थापित करता हूं और इस तरह परत-सूची को संशोधित करता हूं:

<layer-list>
    <item android:drawable="@color/grid_item_activated"/>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/ic_check_white_48dp"/>
    </item>
</layer-list>

वहाँ किसी भी तरह से मैं यह एक का उपयोग कर सकता है VectorDrawable?


11
ऐसा प्रतीत होता है कि यह बस एपीआई 21/22 में बग हो सकता है। मैंने अभी एक एपीआई 23 डिवाइस पर परीक्षण किया था और वेक्टर ड्रॉबल सही ढंग से केंद्रित था।
शाम

1
आपको अपने स्वयं के प्रश्न का उत्तर देना चाहिए और इसे स्वीकार करना चाहिए। इस तरह यह अधिक दृश्यमान है और यह प्रश्न अनुत्तरित नहीं है।
मार्सिन कोज़ीस्की

1
मैंने अपने प्रश्न का उत्तर नहीं दिया है क्योंकि मेरे पास अभी तक एपीआई 21/22 पर क्या करने का जवाब नहीं है। मेरा अस्थायी समाधान वैक्टर के बजाय पीएनजी का उपयोग करना था। आशा है कि अभी भी वैक्टर काम करने का एक तरीका मिल जाएगा।
१६:१६ को

1
मैंने यहाँ एक मुद्दा खोला: code.google.com/p/android/issues/detail?id=219600
toobsco42

यह पहले से ही एपीआई 23 में तय किया गया है, इसलिए मैं अनुमान लगा रहा हूं कि आपकी बग रिपोर्ट को निश्चित रूप से चिह्नित किया जाएगा।
ashughes

जवाबों:


29

मैं एक ही समस्या में भाग गया एक स्तरित सूची पर वैक्टर केंद्रों को आकर्षित करने की कोशिश कर रहा है।

मेरे पास एक वर्कअराउंड है, यह बिल्कुल वैसा ही नहीं है, लेकिन यह काम करता है, आपको संपूर्ण ड्रॉबल के लिए एक आकार सेट करने और वेक्टर आइटम में पैडिंग जोड़ने की आवश्यकता है:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <size android:height="120dp" android:width="120dp"/>
            <solid android:color="@color/grid_item_activated"/>
        </shape>
    </item>
    <item android:top="24dp"
          android:bottom="24dp"
          android:left="24dp"
          android:right="24dp"
          android:drawable="@drawable/ic_check_white_48dp"/>
</layer-list>

ऊपर के आकार का आकार पूरी तरह से आकर्षित करने योग्य का आकार सेट करता है, इस उदाहरण में 120dp, दूसरे आइटम पर पैडिंग, इस उदाहरण में 24dp, वेक्टर छवि को केंद्र में रखता है।

यह gravity="center"एपीआई 21 और 22 में वैक्टर का उपयोग करने के अपने कामकाजी तरीके का उपयोग करने के समान नहीं है ।


2
ऐसा लगता है कि यह आपको इसके भीतर केंद्रित चेक ड्रॉबल के साथ सेट की गई पूरी जगह को भरने देने के बजाय, आपको ड्रा करने योग्य का सटीक आकार (आकार का आकार निर्धारित करने के लिए) जानने की आवश्यकता होगी।
२१:१६

1
आकार को नहीं जान पाना संभव है लेकिन आप इस विधि से पैडिंग को बदल नहीं सकते हैं, आप चित्रपटों में एक दूसरे के ऊपर आरेखों को परत कर सकते हैं। जैसा कि मैंने ऊपर कहा है कि gravity="center"एपीआई 21 और 22 में एक सही समाधान नहीं है ।
निकोलस टायलर

जब यह उपयोग के साथ काम नहीं करता है windowBackground। स्पष्ट आकार इस मामले में कुछ नहीं करते हैं। और यह तब भी काम नहीं करता है जब मैं परत सूची को किसी अन्य परत सूची के अंदर रखता हूं।
वसेवलोद गीनिन

19

उसी समस्या से जूझ रहा है। एकमात्र तरीका जो मैंने इसे ठीक करने के लिए पाया और ड्रॉबल को स्केल करने से बचने के लिए ड्रॉएबल आकार सेट किया और इसे संरेखित करने के लिए गुरुत्वाकर्षण का उपयोग किया:

<layer-list>
    <item android:drawable="@color/grid_item_activated"/>
     <item
        android:gravity="center"
        android:width="48dp"
        android:height="48dp"
        android:drawable="@drawable/ic_check_white_48dp"/>
</layer-list>

आशा करता हूँ की ये काम करेगा!


34
यह एपीआई 21-22 पर मदद नहीं करता है, क्योंकि यह widthविशेषता उन एपीआई स्तरों पर उपलब्ध नहीं है। एपीआई 23 पर, इनकी आवश्यकता नहीं है, क्योंकि बग को ठीक किया गया है और ड्रॉबल को अब और बढ़ाया नहीं गया है।
वंडरसकेबो

3
यह एपीआई 27 के लिए सही ढंग से काम नहीं करता है, छवि फुलस्क्रीन तक
खिंची हुई है

8

संपादित समाधान जो आपके स्प्लैशस्क्रीन को API21 सहित API23 तक सभी पर बहुत अच्छा लगेगा

सबसे पहले इस लेख को पढ़ें और छप स्क्रीन बनाने के अच्छे तरीके का पालन करें।

यदि आपका लोगो विकृत है या फिट नहीं है और आप केवल APIs24 को लक्षित कर रहे हैं + तो आप अपनी वेक्टर ड्रॉबल को सीधे इसके xml फ़ाइल में स्केल कर सकते हैं जैसे:

<vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"
android:viewportWidth="640"
android:viewportHeight="640"
android:width="240dp"
android:height="240dp">
<path
    android:pathData="M320.96 55.9L477.14 345L161.67 345L320.96 55.9Z"
    android:strokeColor="#292929"
    android:strokeWidth="24" />
</vector>

ऊपर दिए गए कोड में मैं एक ड्रॉबल का आकार बदल रहा हूं जिसे मैंने 640x640 कैनवास पर 240x240 पर आकर्षित किया है। तब मैंने इसे अपनी स्प्लैश स्क्रीन की तरह आकर्षित किया और यह बहुत अच्छा काम करता है:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque"
android:paddingBottom="20dp" android:paddingRight="20dp" android:paddingLeft="20dp" android:paddingTop="20dp">

<!-- The background color, preferably the same as your normal theme -->
<item>
    <shape>
        <size android:height="120dp" android:width="120dp"/>
        <solid android:color="@android:color/white"/>
    </shape>
</item>

<!-- Your product logo - 144dp color version of your app icon -->
<item
    android:drawable="@drawable/logo_vect"
    android:gravity="center">

</item>
</layer-list>

मेरा कोड वास्तव में नीचे की तस्वीर में केवल त्रिकोण बना रहा है, लेकिन यहां आप देखते हैं कि आप इसके साथ क्या हासिल कर सकते हैं। बिटमैप का उपयोग करते समय मेरे द्वारा प्राप्त पिक्सेल किनारों के विपरीत रिज़ॉल्यूशन बहुत बढ़िया है। इसलिए हर तरह से एक वेक्टर ड्रा करने योग्य का उपयोग करें (vectr नाम की एक साइट है जिसे मैं डाउनलोड करने के लिए उपयोग करता हूं बिना डाउनलोडिंग सॉफ्टवेयर के)।

EDIT यह API21-22-23 पर भी काम करने के लिए

जबकि उपर्युक्त समाधान API24 को चलाने वाले उपकरणों के लिए काम करता है + मैंने अपने ऐप को API22 पर चलने वाले डिवाइस को स्थापित करने के बाद वास्तव में निराश हो गया। मैंने देखा कि स्प्लैशस्क्रीन फिर से पूरे दृश्य को भरने और गंदगी की तरह दिखने की कोशिश कर रहा था। आधे दिन के लिए मेरी भौंहों को फाड़ने के बाद, मैंने आखिरकार सरासर इच्छाशक्ति द्वारा समाधान को मजबूर कर दिया।

आपको स्प्लैशस्क्रीन xml की तरह एक दूसरी फ़ाइल बनाने की आवश्यकता है (इसे splash_screen.xml कहते हैं) और इसे 2 फ़ोल्डर्स में ड्रा करने योग्य -2222 और ड्रॉबल-वी 21 कहते हैं जिसे आप रेस / फ़ोल्डर में बनाएंगे (उन्हें देखने के लिए) Android से प्रोजेक्ट के लिए अपना प्रोजेक्ट दृश्य बदलना होगा)। यह आपके फोन को उन फ़ोल्डरों में रखी गई फाइलों पर पुनर्निर्देशित करने के लिए कहता है, जब भी संबंधित डिवाइस किसी फ़ोल्डर में ड्रा करने योग्य फ़ोल्डर में -vXX प्रत्यय से संबंधित एपीआई चलाता है, तो इस लिंक को देखें । निम्न कोड को splash_screen.xml फ़ाइल की परत-सूची में रखें जिसे आप इन फ़ोल्डरों में बनाते हैं:

<item>
<shape>
    <size android:height="120dp" android:width="120dp"/>
    <solid android:color="@android:color/white"/>
</shape>
</item>

<!-- Your product logo - 144dp color version of your app icon -->
<item android:gravity="center">
    <bitmap android:gravity="center"
        android:src="logo_vect"/>

</item>

ये कैसे फ़ोल्डर्स दिखते हैं

इन APIs के लिए किसी कारण से आपको अपने ड्रॉबल को बिटमैप में लपेटना होगा ताकि यह काम कर सके और अंतिम परिणाम समान दिखे। मुद्दा यह है कि आपको एडिफ़ेबल ड्राबल फोल्डर के साथ aproach का उपयोग करना होगा क्योंकि splash_screen.xml फ़ाइल के दूसरे संस्करण में आपकी स्प्लैश स्क्रीन 23 से अधिक एपीआई वाले उपकरणों पर दिखाई नहीं दे रही है। एंड्रॉइड के लिए ड्राअबल-वी 24 में स्पलैश_स्क्रीन.एक्सएमएल का पहला संस्करण, निकटतम ड्रॉबल-वीएक्सएक्स फ़ोल्डर में चूक के कारण यह संसाधनों के लिए मिल सकता है।

मेरी छप


4

मैं वर्तमान में क्षैतिज और लंबवत रूप से केंद्रित वेक्टर ड्रॉबल के साथ स्प्लैश स्क्रीन पर काम कर रहा हूं। यहाँ मुझे एपीआई स्तर 25 पर मिला है:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">

<!-- background color, same as theme -->
<item android:drawable="@android:color/white"/>

<!-- app logo -->

<item
    android:drawable="@drawable/my_app_logo"
    android:gravity="center_horizontal|center_vertical"
    android:width="200dp"
    android:height="200dp"
    />
</layer-list>

यदि आप वेक्टर ड्रॉएबल के आयाम को समायोजित करना चाहते हैं, तो ऊपर android:widthऔर android:heightविशेषताओं को संशोधित करें, जरूरी नहीं कि मूल ड्रॉबल को संशोधित करें।

इसके अलावा, मेरा अनुभव वेक्टर बिट को एक बिटमैप टैग में नहीं रखा गया है, जो मेरे लिए कभी काम नहीं करता है। बिटमैप, .png, .jpg और .gif प्रारूप फ़ाइल के लिए है, न कि वेक्टर ड्रिबल के लिए।

संदर्भ

https://developer.android.com/guide/topics/resources/drawable-resource#LayerList

https://developer.android.com/guide/topics/resources/more-resources.html#Dimension


1
सदिश ड्राअब के बारे में अच्छी पकड़ की आवश्यकता है कि एक <बिटमैप> टैग के बजाय <आइटम> टैग के अंदर होना चाहिए।
FrostRocket
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.