پیاده‌سازی نمادهای تطبیقی

«نمادهای تطبیقی» شکل ثابتی در دستگاه دارند اما از دستگاهی به دستگاه دیگر متفاوت هستند و توسعه‌دهنده فقط یک دارایی نماد ارائه می‌دهد. علاوه‌براین، نمادها از دو لایه (پیش‌زمینه و پس‌زمینه) پشتیبانی می‌کنند که می‌توان از آن‌ها برای حرکت استفاده کرد تا لذت بصری برای کاربران فراهم شود.

پیاده‌سازان دستگاه یک پوشش دستگاه ارائه می‌کنند که شکل همه نمادها را در دستگاه تعیین می‌کند. این نماد در هر سطح رابط کاربری سیستم که از «نمادهای راه‌انداز» استفاده می‌کند (مثلاً راه‌انداز، نمای کلی، تنظیمات، و برگ هم‌رسانی) استفاده خواهد شد.

مثال‌ها و منبع

نمونه‌های کد:

  • platform/development/samples/AdaptiveIconSample/

مستندات توسعه‌دهنده:

کد منبع:

  • platform/frameworks/base/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java

پیاده‌سازی

برای تغییر شکل نماد در یک پلاتفرم، یک رشته را در framework/base/core/res/res/values/config.xml، به‌صورت زیر رونهاد کنید:

<!-- Specifies the path that is used by AdaptiveIconDrawable class to crop launcher icons. -->
    <string name="config_icon_mask" translatable="false">"M50,0L100,0 100,100 0,100 0,0z"</string>

قالب و دستور زبان رشته از استاندارد W3، SVG برای تعریف مسیر پیروی می‌کند. این قالب برای PathData همان چیزی است که ترسیمی‌های برداری Android نیز پشتیبانی می‌کنند.

این مسیر باید محدب باشد و باید منطقه امن (۶۶/۷۱ = ۹۱٪) را در محدوده نما رعایت کند. این مورد در یکی از آزمایش‌های CTS اعمال می‌شود.

اگر تصمیم گرفتید از دایره به‌عنوان ماسک پلاتفرم استفاده کنید، حتماً config_useRoundIcon = true را نیز رونهاد کنید. درغیراین‌صورت، این مقدار پیکربندی را روی «نادرست» تنظیم کنید یا این مقدار پیکربندی را مشخص نکنید.

Adaptive Icon API

میانای برنامه‌سازی کاربردی برای کلاس AdaptiveIconDrawable در زیر نشان داده شده است:

package  android.graphics.drawable;
    public class AdaptiveIconDrawable extends Drawable implements Drawable.Callback {
    method public Drawable getBackground();
    method public Drawable getForeground();
    method public Path getIconMask();
    method public Region getSafeZone();
    method public float getExtraInsetFraction();
    method public int getOpacity();
    method public void invalidateDrawable(Drawable);
    method public void scheduleDrawable(Drawable, Runnable, long);
    method public void setAlpha(int);
    method public void setColorFilter(ColorFilter);
    method public void setOpacity(int);
    method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
    }
public class Icon extends Parceleable {
    method public Bitmap createWithAdaptiveBitmap();
    }

پیاده‌سازی مرجع

برای پرداز کردن نمادهای تطبیقی ایستا در هریک از سطوح واسط کاربر سیستم، نیازی به انجام کاری نیست. وقتی PackageManager یک عنصر طراحی برمی‌گرداند، کافی است آن را به یک ImageView پیوند دهید. نمادها در پلاتفرم‌های پیش‌از O ازقبل به این شکل ارائه می‌شوند.

درباره پرداز کردن جلوه حرکت پویا، Launcher3 (platform/packages/apps/Launcher3) پیاده‌سازی مرجعی خواهد داشت که نحوه دستیابی به این جلوه در O-MR1 را نشان می‌دهد.

اعتبارسنجی

برای تأیید پیاده‌سازی، پس‌از ملغی کردن پوشش موردنظر، ببینید آیا نمادها در Launcher3، «تنظیمات»، «نمای کلی»، و «تنظیمات» به‌درستی ارائه می‌شوند یا نه. همچنین می‌توانید AdaptiveIconDrawableTest.java و AdaptiveIconMaskTest.java را در TestCase گرافیک CTS اجرا کنید تا پیاده‌سازی را آزمایش کنید.

یک چارچوب تست دستی توصیه‌شده را می‌توانید در اینجا پیدا کنید: platform/development/samples/AdaptiveIconSample/.

مشکلات شناخته‌شده

مشکلات شناخته‌شده شامل موارد زیر است:

  • نمادهای تار، بسته به نحوه تعریف مسیر ماسک.
  • نمادهای میان‌بر بزرگ‌نمایی‌شده درصورتی‌که توسعه‌دهندگان برنامه از روش Icon.createWithAdaptiveBitmap() استفاده نکنند، یا از این روش به‌درستی استفاده نکنند. برای اینکه این روش به‌درستی کار کند، Bitmap ارسال‌شده باید در هر چهار طرف ۲۵٪ حاشیه داشته باشد.

این مشکلات را می‌توان به‌صورت زیر برطرف کرد:

  • پوشش باید در سیستم مختصات [۰، ۱۰۰] × [۰، ۱۰۰] تعریف شود.
  • مطمئن شوید که تصاویر استفاده‌شده برای نمادهای تطبیقی (نمادهای راه‌انداز، میان‌برها) در هر چهار طرف حاشیه داخلی کافی (۲۵٪) داشته باشند.