Android Studio Image Asset Launcher Icon Transparent Background Color

后端 未结 4 1110
遇见更好的自我
遇见更好的自我 2020-12-08 07:46

You might be thinking this question is a duplicate of this one. But since then, Android Studio has been updated and the solution given there is not working anymore.

4条回答
  •  悲哀的现实
    2020-12-08 08:00

    Android 8.0 Oreo (API level 26) introduced adaptive launcher icons, which consist of two layers: a foreground and a background. The material design guidelines state that the background layer must be opaque in Android O and beyond, as you can see at the bottom of the following citation. So, the adaptive launcher icon for Android 8.0 or higher must have opaque background color at least, if targetSdkVersion of your app is 26 or higher.

    https://material.io/guidelines/style/icons.html#icons-icons-for-android

    Icons for Android

    Android O and beyond

    Android O icons represent your app on a device's Home and All Apps screens. The following guidelines describe how icons can receive unique visual treatments, animations, and behaviors.

    ...

    Layer specs

    Icons consist of two layers: a foreground and a background. Each layer can animate and receive treatments independently from the other layer.

    Foreground (scrolling parallax)

    • 108 x 108 dp
    • 72dp masked section
    • Transparency recommended (optional)

    Background (subtler parallax)

    • 108 X 108 dp
    • 72dp masked section
    • Must be opaque

    Workaround for 7.1 or lower

    Although launcher icons for 8.0 or higher must have opaque background color, the other legacy launcher icons for 7.1 or lower can revert to transparent background color, if you can omit round launcher icons from your app.

    1. First, create Launcher Icons (Adaptive and Legacy). It will create adaptive launcher icons and legacy launcher icons. All of them have opaque background color, at first.
    2. After that, create Launcher Icons (Legacy only). This will overwrite only the existing legacy launcher icons, as you can see in the second screenshot below. If you set the shape to none, they will have transparent background color.
    3. Delete folder res/mipmap/ic_laucher_round in the project window.
    4. Open AndroidManifest.xml and remove attribute android:roundIcon="@mipmap/ic_launcher_round" from the application element.

    STEP 1

    In the left-side pane above, the following XML files define adaptive launcher icons for Android 8.0 or higher.

    • mipmap-anydpi-v26/ic_launcher.xml
    • mipmap-anydpi-v26/ic_launcher_round.xml

    As seen in the right-side pane, they refer to the following drawable XML files.

    • drawable/ic_launcher_background.xml
    • drawable-v24/ic_launcher_foreground.xml

    STEP 2


    Update #1:

    In Android 8.0 or higher, the background color of launcher icons can be transparent, as shown in the Android 8.1 (Nexus 5X) screenshots. The sample app "NoAdaptive" is without any resource for the adaptive launcher icons in folder mipmap-anydpi-v26, and the other app "Adaptive" has the resource.

    Home screen in Android 8.1 (Nexus 5X) Recents screen in Android 8.1 (Nexus 5X)


    Update #2:

    Although the background color of launcher icon can be transparent in Android 8.0 or higher, it depends on user’s launcher app. Some launcher apps will convert your legacy icon to opaque adaptive icon.

    In Nexus 5X device (Android 8.1)

    The default launcher app is Google Now Launcher, according to its package name com.google.android.launcher. The background color can be transparent, as in the screenshots of Update #1.

    In Nexus 5 emulator (Android 8.1)

    The default launcher app is Pixel Launcher, according to its package name com.google.android.apps.nexuslauncher. The background color can be transparent in Recents screen, as in the screenshots below:

    • opaque in Home screen
    • transparent in Recents screen
    • opaque in All Apps screen

    Home, AllApps and Recents screens in Nexus 5 emulator

    Opaque white background in some launcher apps

    These GMS apps are closed-source:

    • com.google.android.launcher Google Now Launcher
    • com.google.android.apps.nexuslauncher Pixel Launcher

    In contrast, AOSP apps are open-source. Most launcher apps in Android are based on the source code of the following launcher apps:

    • com.android.launcher
      • Launcher (discontinued)
      • Launcher2 (legacy)
    • com.android.launcher2
      • Launcher2 (original package name)
    • com.android.launcher3
      • Launcher3 (for Android 5.0 Lollipop or higher)

    Launcher3 source code

    In the git branch oreo-release of Launcher3, LauncherIcons.java has the method wrapToAdaptiveIconDrawable that wraps legacy launcher icon in adaptive launcher icon.

    /**
     * If the platform is running O but the app is not providing AdaptiveIconDrawable, then
     * shrink the legacy icon and set it as foreground. Use color drawable as background to
     * create AdaptiveIconDrawable.
     */
    static Drawable wrapToAdaptiveIconDrawable(Context context, Drawable drawable, float scale) {
        if (!(FeatureFlags.LEGACY_ICON_TREATMENT && Utilities.isAtLeastO())) {
            return drawable;
        }
        try {
            if (!(drawable instanceof AdaptiveIconDrawable)) {
                AdaptiveIconDrawable iconWrapper = (AdaptiveIconDrawable)
                        context.getDrawable(R.drawable.adaptive_icon_drawable_wrapper).mutate();
                FixedScaleDrawable fsd = ((FixedScaleDrawable) iconWrapper.getForeground());
                fsd.setDrawable(drawable);
                fsd.setScale(scale);
                return (Drawable) iconWrapper;
            }
        } catch (Exception e) {
            return drawable;
        }
        return drawable;
    }
    

    The flag FeatureFlags.LEGACY_ICON_TREATMENT is defined in FeatureFlags.java:

    // When enabled, icons not supporting {@link AdaptiveIconDrawable} will be wrapped in this class.
    public static final boolean LEGACY_ICON_TREATMENT = true;
    

    So, the background color of legacy launcher icon depends on this flag, and it can be opaque in some launcher apps such as Pixel Launcher.

    The background color

    If the flag is set to true, a new adaptive launcher icon is created with R.drawable.adaptive_icon_drawable_wrapper, and the existing legacy icon becomes its foreground layer. The background layer is a drawable: @color/legacy_icon_background, according to the resource XML file:

    
        
        
            
        
    
    

    The color legacy_icon_background is defined in colors.xml

    #FFFFFF
    

    So, the background color becomes white.

提交回复
热议问题