اضافه کردن گرافیک‌های برداری چند چگالی (Views)

مفاهیم و پیاده‌سازی Jetpack Compose

اندروید استودیو شامل ابزاری به نام Vector Asset Studio است که به شما کمک می‌کند آیکون‌های متریال را اضافه کنید و فایل‌های Scalable Vector Graphic (SVG) و Adobe Photoshop Document (PSD) را به عنوان منابع برداری قابل ترسیم به پروژه خود وارد کنید. استفاده از فایل‌های برداری قابل ترسیم به جای بیت‌مپ‌ها، اندازه APK شما را کاهش می‌دهد زیرا می‌توان همان فایل را برای تراکم‌های مختلف صفحه نمایش بدون از دست دادن کیفیت تصویر تغییر اندازه داد. برای نسخه‌های قبلی اندروید که از فایل‌های برداری قابل ترسیم پشتیبانی نمی‌کنند، Vector Asset Studio می‌تواند در زمان ساخت، فایل‌های برداری قابل ترسیم شما را به اندازه‌های مختلف بیت‌مپ برای هر تراکم صفحه نمایش تبدیل کند.

درباره استودیوی وکتور اسِت

Vector Asset Studio یک گرافیک برداری را به عنوان یک فایل XML که تصویر را توصیف می‌کند، به پروژه اضافه می‌کند. نگهداری یک فایل XML می‌تواند آسان‌تر از به‌روزرسانی چندین گرافیک رستری با وضوح‌های مختلف باشد.

اندروید ۴.۴ (سطح API 20) و پایین‌تر از vector drawableها پشتیبانی نمی‌کند. اگر حداقل سطح API شما روی یکی از این سطوح API تنظیم شده باشد، هنگام استفاده از Vector Asset Studio دو گزینه دارید: فایل‌های Portable Network Graphic (PNG) (پیش‌فرض) تولید کنید یا از تکنیک سازگاری معکوس در AndroidX استفاده کنید.

برای سازگاری با نسخه‌های قبلی، Vector Asset Studio تصاویر رستری از فایل‌های قابل ترسیم برداری تولید می‌کند. فایل‌های قابل ترسیم برداری و رستری در فایل APK با هم بسته‌بندی شده‌اند. می‌توانید فایل‌های قابل ترسیم برداری را در کد جاوا Drawable یا در کد XML @drawable خطاب کنید. وقتی برنامه شما اجرا می‌شود، تصویر برداری یا رستری مربوطه بسته به سطح API به طور خودکار نمایش داده می‌شود.

سازگاری معکوس در AndroidX

این تکنیک به AndroidX 1.0 یا بالاتر و افزونه Android برای Gradle 3.2 یا بالاتر نیاز دارد و فقط از vector drawableها استفاده می‌کند. کلاس VectorDrawableCompat در AndroidX به شما امکان می‌دهد VectorDrawable در اندروید 2.1 (سطح API 7) و بالاتر پشتیبانی کنید.

قبل از استفاده از Vector Asset Studio، باید یک دستور به فایل build.gradle خود اضافه کنید:

گرووی

android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}

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

کاتلین

android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}

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

همچنین باید از تکنیک‌های کدنویسی AndroidX برای سازگاری با نسخه‌های قبلی استفاده کنید، مانند استفاده از ویژگی app:srcCompat به جای ویژگی android:src برای فایل‌های vector drawables. برای اطلاعات بیشتر، به AndroidX مراجعه کنید.

افزودن یک بردار قابل ترسیم به یک طرح‌بندی

در یک فایل طرح‌بندی، می‌توانید هر ویجت مرتبط با آیکون، مانند ImageButton ، ImageView و غیره را طوری تنظیم کنید که به یک بردار قابل ترسیم اشاره کند. برای مثال، طرح‌بندی زیر یک بردار قابل ترسیم را نشان می‌دهد که روی یک دکمه نمایش داده می‌شود:

شکل ۱. یک بردار قابل ترسیم که روی یک دکمه در یک طرح‌بندی نمایش داده می‌شود.

برای نمایش یک بردار قابل ترسیم روی یک ویجت، همانطور که در شکل نشان داده شده است:

  1. یک پروژه را باز کنید و یک بردار قابل ترسیم را وارد کنید .

    این مثال از یک پروژه تلفن/تبلت که با استفاده از ویزارد پروژه جدید ایجاد شده است، استفاده می‌کند.

  2. در نمای اندروید پنجره پروژه ، روی یک فایل XML طرح‌بندی، مانند content_main.xml ، دوبار کلیک کنید.

  3. برای نمایش ویرایشگر طرح‌بندی، روی برگه طراحی (Design) کلیک کنید.

  4. ویجت ImageButton را از پنجره Palette به ویرایشگر طرح‌بندی بکشید.

  5. در پنجره‌ی Resources ، در پنل سمت چپ، Drawable را انتخاب کنید و سپس vector drawable که وارد کرده‌اید را انتخاب کنید. روی OK کلیک کنید.

    بردار قابل ترسیم روی ImageButton در طرح‌بندی ظاهر می‌شود.

  6. برای تغییر رنگ تصویر به رنگ تأکیدی تعریف‌شده در تم، در پنجره‌ی Properties ، ویژگی tint را پیدا کرده و روی ... کلیک کنید.

  7. در پنجره‌ی Resources ، در پنل سمت چپ، گزینه‌ی Color و سپس colorAccent را انتخاب کنید. روی OK کلیک کنید.

    رنگ تصویر به رنگ تاکیدی در طرح‌بندی تغییر می‌کند.

اگر پروژه از 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" خواهد بود.

ارجاع به یک بردار قابل ترسیم در کد

شما معمولاً می‌توانید به یک منبع قابل ترسیم برداری به صورت عمومی در کد خود ارجاع دهید، و هنگامی که برنامه شما اجرا می‌شود، تصویر برداری یا رستری مربوطه بسته به سطح API به طور خودکار نمایش داده می‌شود:

  • در بیشتر موارد، می‌توانید به vector drawableها در کد XML به صورت @drawable یا در کد جاوا Drawable اشاره کنید.

    برای مثال، کد XML طرح‌بندی زیر، تصویر را به یک نما اعمال می‌کند:

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

    کد زیر تصویر را به عنوان یک Drawable بازیابی می‌کند:

    کاتلین

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

    جاوا

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

    متد getResources() در کلاس Context قرار دارد که به اشیاء رابط کاربری مانند activityها، fragmentها، layoutها، viewها و غیره اعمال می‌شود.

  • اگر برنامه شما اصلاً از AndroidX استفاده می‌کند (حتی اگر عبارت vectorDrawables.useSupportLibrary = true را در فایل build.gradle خود نداشته باشید)، می‌توانید با استفاده از عبارت app:srcCompat به یک vector drawable ارجاع دهید. برای مثال:

    <ImageView
      android:layout_height="wrap_content"
      android:layout_width="wrap_content"
      app:srcCompat="@drawable/myimage" />
  • گاهی اوقات، ممکن است لازم باشد منبع drawable را دقیقاً به کلاس آن تبدیل نوع (typecast) کنید، مانند زمانی که نیاز به استفاده از ویژگی‌های خاص کلاس VectorDrawable دارید. برای انجام این کار، می‌توانید از کدی مانند کد زیر استفاده کنید:

    کاتلین

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

    جاوا

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

شما فقط می‌توانید از طریق نخ اصلی به منابع قابل ترسیم برداری دسترسی داشته باشید.

برای اندروید ۵.۰ (سطح API ۲۱) و بالاتر، می‌توانید از کلاس AnimatedVectorDrawable برای متحرک‌سازی ویژگی‌های کلاس VectorDrawable استفاده کنید. با AndroidX، می‌توانید از کلاس AnimatedVectorDrawableCompat برای متحرک‌سازی کلاس VectorDrawable برای اندروید ۳.۰ (سطح API ۱۱) و بالاتر استفاده کنید. برای اطلاعات بیشتر، به بخش Animate drawable graphics مراجعه کنید.