Как реализовать тематические иконки с помощью Material You в моем приложении для Android?

#android-12 #material-you

Вопрос:

Я ничего не могу найти об этом в Интернете, никакой документации, ничего. Может быть, кто-то из вас знает, как это сделать, или у вас есть несколько советов для меня. Заранее благодарю вас.

Ответ №1:

Обновление от 18.02.2022: Android 13 имеет официальную поддержку тематических значков. Просто следуйте их инструкциям здесь: https://developer.android.com/about/versions/13/features#themed-app-icons

Чтобы последовать их примеру:

  1. Создайте монохромную версию значка вашего приложения
  2. Добавьте это в свой ic_launcher.xml файл под набором тегов <adaptive-icon /> :
     <adaptive-icon>
        <background android:drawable="..." />
        <foreground android:drawable="..." />
        <monochrome android:drawable="@drawable/myicon" />
    </adaptive-icon>
     
  3. Добавьте свой значок в свой манифест:
     <application
        …
        android:icon="@mipmap/ic_launcher"
        …>
    </application>
     

Примечание: если android:roundIcon и android:icon оба в вашем манифесте, вы должны либо удалить ссылку android:roundIcon , либо указать монохромный значок в drawable, определяемый android:roundIcon атрибутом.

Все это было взято непосредственно из примера разработчика Google.


Похоже, на этот вопрос есть противоречивые ответы, но этот вопрос в репозитории Material Components GitHub, похоже, дает наибольшее представление: https://github.com/material-components/material-components-android/issues/2357

В частности, с помощью адаптивного значка, подобного этому:

 <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt">
    <background android:drawable="@color/launcher_icon_background"/>

    <foreground>
        <aapt:attr name="android:drawable">
            <vector
                android:width="108dp"
                android:height="108dp"
                android:viewportWidth="108"
                android:viewportHeight="108">
                <path
                    android:fillColor="@color/launcher_icon"
                    android:pathData="m54,74.5l23.3,-29c-0.9,-0.7 -9.9,-8 -23.3,-8c-13.4,0 -22.4,7.3 -23.3,8l23.3,29l0,0c0,0 0,0 0,0zm7.7,-27.3c1.4,1.7 2.3,3.9 2.3,6.3l0,2l-20,0l0,-2c0,-2.4 0.9,-4.6 2.3,-6.3l-2.3,-2.3l1.4,-1.4l2.3,2.3c1.7,-1.4 3.9,-2.3 6.3,-2.3c2.4,0 4.6,0.9 6.3,2.3l2.3,-2.3l1.4,1.4l-2.3,2.3zm-9.7,4.3c0,1.1 -0.9,2 -2,2c-1.1,0 -2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2c1.1,0 2,0.9 2,2zm8,0c0,1.1 -0.9,2 -2,2c-1.1,0 -2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2c1.1,0 2,0.9 2,2z" />
                </vector>
        </aapt:attr>
    </foreground>
</adaptive-icon>
 

… с цветами, определенными в colors.xml этом, относятся к определяемым системой цветам, которые получены из палитры Material 3 color:

 <resources>
    <color name="launcher_icon_background">@android:color/system_accent1_100</color>
    <color name="launcher_icon">@android:color/system_neutral1_800</color>
</resources>
 

Обратите внимание, что эти цвета зависят от определяемой системой палитры, как описано в Material Design 3: https://m3.material.io/libraries/mdc-android/color-theming

Вероятно, вам придется создавать отдельные файлы ресурсов, специально предназначенные для API 31 . Я не проверял эти рекомендации.

Комментарии:

1. Это работает, но как мне добиться того, чтобы дизайн применялся только в том случае, если тематические иконки активированы в настройках устройства Android?

2. nvm я видел, что это функция запуска Pixel. спасибо за помощь

3. К сожалению, я понятия не имею об этом втором вопросе. 🙁

4. Обратите внимание, что адаптивные иконки были представлены в Android 8.0 (уровень API 26).

5. @LucaNicoletti В принципе, вы не можете с Android 12. Проверьте эту функцию для Android 13, хотя: developer.android.com/about/versions/13 /…