Как использовать IconCompat.createWithAdaptiveBitmap - PullRequest
0 голосов
/ 11 января 2019

Я хочу применить адаптивные значки к ярлыкам, сгенерированным следующим кодом (код только для справки, он не компилируется):

ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(context, "com.myapp.mainactivity")
                    .setShortLabel(context.getResources().getString("short label"))
                    .setLongLabel(context.getResources().getString("long label"))
                    .setIcon(IconCompat.createWithAdaptiveBitmap(bitmap)
                    .setIntent(targetActivityIntent)
                    .build();

public Bitmap getLauncherIcon(final Context context) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        return null;
    } else {
        Drawable backgroundDrawable = context.getDrawable(R.mipmap.ic_launcher_background);
        Drawable vectorDrawable = context.getDrawable(R.drawable.ic_launcher_main_foreground);
        AdaptiveIconDrawable adaptiveIconDrawable = new AdaptiveIconDrawable(backgroundDrawable, vectorDrawable);
        Bitmap bitmap = drawableToBitmap(adaptiveIconDrawable);
        return bitmap;
    }
}

private static Bitmap drawableToBitmap(Drawable drawable) {
    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
    return bitmap;
}

Это мой значок (ic_main_white.xml)

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="45dp"
        android:height="45dp"
        android:viewportHeight="1024"
        android:viewportWidth="1024">
    <path
        android:fillColor="#FFFFFF"
        android:pathData="M511.5 74C269.87847 74 74 269.87847 74 511.5 74 753.13368 269.87847 949 511.5 949 753.12153 949 949 753.13368 949 511.5 949 269.87847 753.12153 74 511.5 74l0 0 0 0 0 0zm30.10243 764.20312l0 -140.08506 -57.72569 0 0 140.27951C325.65972 825.12674 199.05208 699.1875 184.78472 541.25l142.21181 0 0 -57.72569 -142.34549 0C198.12847 324.77257 325.07639 197.95833 483.87674 184.63889l0 142.00521 57.72569 0 0 -141.81077c157.64583 14.40104 283.32986 140.76563 296.74653 298.69098l-139.87847 0 0 57.72569 139.74479 0C824.02083 698.34896 698.66493 823.85069 541.60243 838.20312l0 0z"/>
</vector>

Используя Android Asset Generator, я создал Image Asset, где я получаю все необходимые сгенерированные файлы. Это тот же процесс, который вы прошли бы при создании адаптивного значка для значка запуска вашего приложения.

Но в результате отображается только часть отображаемого значка, похоже, что созданный значок слишком велик для ожидаемого, или я что-то упустил где-то.

Также есть эта документация, где указано следующее:

Для динамических ярлыков вызывайте метод createWithAdaptiveBitmap (), когда Вы создаете их.

Значки создаются самой Android Studio, и это также работает со значком моего модуля запуска, но почему он не работает правильно с помощью createWithAdaptiveBitmap? Мне не хватает Java-кода или вы знаете пример использования адаптивных иконок с ярлыками, я не смог найти ничего, что работало бы на GitHub или где-то еще.

1 Ответ

0 голосов
/ 14 января 2019

Для решения вам нужно:

  1. Когда вы генерируете иконку с помощью менеджера ресурсов в Android Studio, убедитесь, что иконка находится внутри «защищенной области», очень важно, чтобы активы имели правильный размер (см. https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive)

  2. Преобразование в растровое изображение является ключевым:

    private static Bitmap drawableToBitmap(final Drawable drawable, final Context context) {
    
      final float screenDensity = context.getResources().getDisplayMetrics().density;
      final int adaptiveIconSize = Math.round(ADAPTIVE_ICON_SIZE_DP * screenDensity);
      final int adaptiveIconOuterSides = Math.round(ADAPTIVE_ICON_OUTER_SIDES_DP * screenDensity);
    
      final Bitmap bitmap = Bitmap.createBitmap(adaptiveIconSize, adaptiveIconSize, Bitmap.Config.ARGB_8888);
      final Canvas canvas = new Canvas(bitmap);
      drawable.setBounds(adaptiveIconOuterSides, adaptiveIconOuterSides, adaptiveIconSize - adaptiveIconOuterSides,
            adaptiveIconSize - adaptiveIconOuterSides);
      drawable.draw(canvas);
      return bitmap;
    }
    
...