अलग-अलग डेंसिटी वाले वेक्टर ग्राफ़िक (व्यू) जोड़ना

सिद्धांत और Jetpack Compose को लागू करना

Android Studio में, Vector Asset Studio नाम का एक टूल शामिल होता है. इसकी मदद से, Material आइकॉन जोड़े जा सकते हैं. साथ ही, स्केलेबल वेक्टर ग्राफ़िक (एसवीजी) और Adobe Photoshop Document (PSD) फ़ाइलों को वेक्टर ड्रॉएबल संसाधनों के तौर पर अपने प्रोजेक्ट में इंपोर्ट किया जा सकता है. बिटमैप के बजाय वेक्टर ड्रॉएबल का इस्तेमाल करने से, आपके APK का साइज़ कम हो जाता है. ऐसा इसलिए होता है, क्योंकि इमेज की क्वालिटी में कोई बदलाव किए बिना, एक ही फ़ाइल का साइज़ अलग-अलग स्क्रीन डेंसिटी के हिसाब से बदला जा सकता है. Android के पुराने वर्शन में, वेक्टर ड्रॉएबल का इस्तेमाल नहीं किया जा सकता. हालांकि, Vector Asset Studio, बिल्ड के समय आपके वेक्टर ड्रॉएबल को हर स्क्रीन डेंसिटी के लिए अलग-अलग बिटमैप साइज़ में बदल सकता है.

वेक्टर ऐसेट स्टूडियो के बारे में जानकारी

वेक्टर ऐसेट स्टूडियो, प्रोजेक्ट में वेक्टर ग्राफ़िक को एक्सएमएल फ़ाइल के तौर पर जोड़ता है. यह फ़ाइल, इमेज के बारे में जानकारी देती है. एक एक्सएमएल फ़ाइल को मैनेज करना, अलग-अलग रिज़ॉल्यूशन वाले कई रास्टर ग्राफ़िक को अपडेट करने से ज़्यादा आसान हो सकता है.

Android 4.4 (एपीआई लेवल 20) और इससे पहले के वर्शन पर, वेक्टर ड्रॉएबल काम नहीं करते. अगर आपका न्यूनतम एपीआई लेवल इनमें से किसी एक एपीआई लेवल पर सेट है, तो Vector Asset Studio का इस्तेमाल करते समय आपके पास दो विकल्प होते हैं: पोर्टेबल नेटवर्क ग्राफ़िक (पीएनजी) फ़ाइलें जनरेट करें (डिफ़ॉल्ट रूप से) या AndroidX में बैकवर्ड कंपैटिबिलिटी तकनीक का इस्तेमाल करें.

पुराने सिस्टम के साथ काम करने की सुविधा के लिए, Vector Asset Studio, वेक्टर ड्रॉएबल की रास्टर इमेज जनरेट करता है. वेक्टर और रास्टर ड्रॉएबल को APK में एक साथ पैकेज किया जाता है. Java कोड में वेक्टर ड्रॉएबल को Drawable या XML कोड में @drawable के तौर पर इस्तेमाल किया जा सकता है. जब आपका ऐप्लिकेशन चलता है, तब एपीआई लेवल के हिसाब से, उससे जुड़ी वेक्टर या रास्टर इमेज अपने-आप दिखती है.

AndroidX में पुराने सिस्टम के साथ काम करने की सुविधा

इस तकनीक के लिए, AndroidX 1.0 या इसके बाद के वर्शन और Android Plugin for Gradle 3.2 या इसके बाद के वर्शन की ज़रूरत होती है. साथ ही, यह सिर्फ़ वेक्टर ड्रॉएबल का इस्तेमाल करती है. AndroidX में मौजूद VectorDrawableCompat क्लास की मदद से, Android 2.1 (एपीआई लेवल 7) और इसके बाद के वर्शन में VectorDrawable की सुविधा इस्तेमाल की जा सकती है.

Vector Asset Studio का इस्तेमाल करने से पहले, आपको अपनी build.gradle फ़ाइल में यह स्टेटमेंट जोड़ना होगा:

शानदार

android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}

dependencies {
    implementation 'androidx.appcompat:appcompat:1.7.1'
}

Kotlin

android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}

dependencies {
    implementation("androidx.appcompat:appcompat:1.7.1")
}

आपको बैकवर्ड कंपैटिबिलिटी के लिए, AndroidX कोडिंग तकनीकों का भी इस्तेमाल करना होगा. जैसे, वेक्टर ड्रॉएबल के लिए android:src एट्रिब्यूट के बजाय app:srcCompat एट्रिब्यूट का इस्तेमाल करना. ज़्यादा जानकारी के लिए, AndroidX देखें.

किसी लेआउट में ड्रॉ करने लायक वेक्टर जोड़ना

लेआउट फ़ाइल में, आइकॉन से जुड़े किसी भी विजेट को वेक्टर ड्रॉएबल पर सेट किया जा सकता है. जैसे, ImageButton, ImageView वगैरह. उदाहरण के लिए, यहां दिए गए लेआउट में, बटन पर दिखने वाला वेक्टर ड्रॉएबल दिखाया गया है:

पहली इमेज. लेआउट में मौजूद बटन पर दिखाया गया वेक्टर ड्रॉएबल.

विजेट पर वेक्टर ड्रॉएबल दिखाने के लिए, जैसा कि इमेज में दिखाया गया है:

  1. कोई प्रोजेक्ट खोलें और वेक्टर ड्रॉएबल इंपोर्ट करें.

    इस उदाहरण में, New Project Wizard की मदद से जनरेट किए गए फ़ोन/टैबलेट प्रोजेक्ट का इस्तेमाल किया गया है.

  2. प्रोजेक्ट विंडो के Android व्यू में, लेआउट एक्सएमएल फ़ाइल पर दो बार क्लिक करें. जैसे, content_main.xml.

  3. लेआउट एडिटर को दिखाने के लिए, डिज़ाइन टैब पर क्लिक करें.

  4. ImageButton विजेट को Palette विंडो से खींचकर, Layout Editor पर छोड़ें.

  5. संसाधन डायलॉग में, बाईं ओर मौजूद पैनल में ड्रॉएबल को चुनें. इसके बाद, इंपोर्ट किया गया वेक्टर ड्रॉएबल चुनें. ठीक है पर क्लिक करें.

    लेआउट में ImageButton पर वेक्टर ड्रॉएबल दिखता है.

  6. इमेज का रंग बदलकर, थीम में तय किया गया एक्सेंट कलर सेट करने के लिए, प्रॉपर्टी विंडो में जाकर, टिंट प्रॉपर्टी ढूंढें और पर क्लिक करें .

  7. संसाधन डायलॉग में, बाईं ओर मौजूद पैनल में कलर को चुनें. इसके बाद, colorAccent को चुनें. ठीक है पर क्लिक करें.

    लेआउट में इमेज का रंग, ऐक्सेंट कलर में बदल जाता है.

अगर प्रोजेक्ट में AndroidX का इस्तेमाल किया जाता है, तो ImageButton कोड इस तरह का होना चाहिए:

<ImageButton
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  app:srcCompat="@drawable/ic_build_black_24dp"
  tools:layout_editor_absoluteX="11dp"
  tools:layout_editor_absoluteY="225dp"
  android:id="@+id/imageButton"
  android:tint="@color/colorAccent" />

अगर प्रोजेक्ट में AndroidX का इस्तेमाल नहीं किया जाता है, तो वेक्टर ड्रॉएबल कोड android:src="@drawable/ic_build_black_24dp" होगा.

कोड में ड्रॉ करने लायक वेक्टर को रेफ़र करना

आम तौर पर, अपने कोड में वेक्टर ड्रॉएबल रिसॉर्स को सामान्य तरीके से रेफ़र किया जा सकता है. इसके बाद, जब आपका ऐप्लिकेशन चलता है, तो एपीआई लेवल के हिसाब से, उससे जुड़ी वेक्टर या रास्टर इमेज अपने-आप दिखती है:

  • ज़्यादातर मामलों में, एक्सएमएल कोड में वेक्टर ड्रॉएबल को @drawable के तौर पर या Java कोड में Drawable के तौर पर इस्तेमाल किया जा सकता है.

    उदाहरण के लिए, यहां दिया गया लेआउट एक्सएमएल कोड, किसी व्यू पर इमेज लागू करता है:

    <ImageView
      android:layout_height="wrap_content"
      android:layout_width="wrap_content"
      android:src="@drawable/myimage" />

    नीचे दिया गया कोड, इमेज को Drawable के तौर पर वापस लाता है:

    Kotlin

    val drawable = resources.getDrawable(R.drawable.myimage, theme)

    Java

    Resources res = getResources();
    Drawable drawable = res.getDrawable(R.drawable.myimage, getTheme());

    getResources() मेथड, Context क्लास में मौजूद होता है. यह यूज़र इंटरफ़ेस (यूआई) ऑब्जेक्ट पर लागू होता है. जैसे, ऐक्टिविटी, फ़्रैगमेंट, लेआउट, व्यू वगैरह.

  • अगर आपका ऐप्लिकेशन AndroidX का इस्तेमाल करता है (भले ही, आपकी vectorDrawables.useSupportLibrary = true फ़ाइल में vectorDrawables.useSupportLibrary = true स्टेटमेंट न हो), तो app:srcCompat स्टेटमेंट वाले वेक्टर ड्रॉएबल का भी इस्तेमाल किया जा सकता है.build.gradle उदाहरण के लिए:

    <ImageView
      android:layout_height="wrap_content"
      android:layout_width="wrap_content"
      app:srcCompat="@drawable/myimage" />
  • कभी-कभी, आपको ड्रॉअबल रिसॉर्स को उसकी सटीक क्लास में टाइपकास्ट करने की ज़रूरत पड़ सकती है. जैसे, जब आपको VectorDrawable क्लास की कुछ खास सुविधाओं का इस्तेमाल करना हो. इसके लिए, इस तरह के कोड का इस्तेमाल किया जा सकता है:

    Kotlin

    if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.LOLLIPOP) {
      val vectorDrawable = drawable as VectorDrawable
    } else {
      val bitmapDrawable = drawable as BitmapDrawable
    }

    Java

    if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.LOLLIPOP) {
      VectorDrawable vectorDrawable = (VectorDrawable) drawable;
    } else {
      BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
    }

वेक्टर ड्रॉएबल रिसॉर्स को सिर्फ़ मुख्य थ्रेड से ऐक्सेस किया जा सकता है.

Android 5.0 (एपीआई लेवल 21) और इसके बाद के वर्शन के लिए, VectorDrawable क्लास की प्रॉपर्टी को ऐनिमेट करने के लिए, AnimatedVectorDrawable क्लास का इस्तेमाल किया जा सकता है. AndroidX की मदद से, Android 3.0 (एपीआई लेवल 11) और इसके बाद के वर्शन के लिए, VectorDrawable क्लास को ऐनिमेट करने के लिए AnimatedVectorDrawableCompat क्लास का इस्तेमाल किया जा सकता है. ज़्यादा जानकारी के लिए, ड्रॉ किए जा सकने वाले ग्राफ़िक को ऐनिमेट करना लेख पढ़ें.