透明的自适应图标背景

时间:2017-12-08 22:15:06

标签: android

所以我已经在这个应用程序上工作了几个星期,我开始构建图标。我有Android Studio 3.0.1,他们似乎改变了Image Assets的制作方式,现在他们有了自适应图标。我为我的应用制作了一个带透明背景的图标。以前,我只是将形状更改为“无”,并且不会生成背景。但现在这不是一个选择,除非我去“遗产”,这是无用的。背景颜色似乎不支持透明度。即使在ic_launcher.xml我将背景设置为透明色,但图标仍然显示为黑色背景。

这是我的ic_lancher.xml

<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@color/transparent"/>
    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

ic_launcher_round.xml是一样的。 @color/transparent位是这个:

<color name="transparent">#00000000</color>

5 个答案:

答案 0 :(得分:5)

透明背景将是不透明的黑色。

根据Android 8.0框架的源代码,<background>图层本质上是不透明的;如问题所述,框架用不透明的黑色填充背景。

框架有一个类AdaptiveIconDrawable,它绘制自适应启动器图标。 https://developer.android.com/reference/android/graphics/drawable/AdaptiveIconDrawable.html
元素<adaptive-icon>创建了它的实例:

  

除了动态创建之外,还可以使用<adaptive-icon>标记通过XML通胀创建此类。

draw中方法AdaptiveIconDrawable.java的{​​p> The source code是:

@Override
public void draw(Canvas canvas) {
    if (mLayersBitmap == null) {
        return;
    }
    if (mLayersShader == null) {
        mCanvas.setBitmap(mLayersBitmap);
        mCanvas.drawColor(Color.BLACK);
        for (int i = 0; i < mLayerState.N_CHILDREN; i++) {
            if (mLayerState.mChildren[i] == null) {
                continue;
            }
            final Drawable dr = mLayerState.mChildren[i].mDrawable;
            if (dr != null) {
                dr.draw(mCanvas);
            }
        }
        mLayersShader = new BitmapShader(mLayersBitmap, TileMode.CLAMP, TileMode.CLAMP);
        mPaint.setShader(mLayersShader);
    }
    if (mMaskBitmap != null) {
        Rect bounds = getBounds();
        canvas.drawBitmap(mMaskBitmap, bounds.left, bounds.top, mPaint);
    }
}

简而言之,Canvas实例接收要绘制的位图,并且最初用黑色填充位图。然后前景drawable和背景drawable完成工作:

mCanvas.setBitmap(mLayersBitmap); // reset
mCanvas.drawColor(Color.BLACK);   // fill
for (int i = 0; i < mLayerState.N_CHILDREN; i++) { // two layers
    ...
    final Drawable dr = mLayerState.mChildren[i].mDrawable;
    ...
        dr.draw(mCanvas); // draw
    ...
}

Color.BLACK是不透明的:

  

0xff000000

方法drawColor使用SRC_OVER模式用它填充位图:

  

使用srcover porterduff模式使用指定的颜色填充整个画布的位图(限制为当前剪辑)。

因此,即使您为背景设置透明色,背景也总是不透明的,如下面的屏幕截图所示(从my answer到类似的问题)。

NoAdaptive and Adaptive

答案 1 :(得分:0)

您说旧图标是“无用的”,但是唯一的逻辑解决方案是使用旧图标。如果您根本不创建自适应图标,则Android 8.0及更高版本将必须使用旧版图标。此外,具有透明背景的自适应图标是矛盾的概念,因为自适应图标的主要特征是前景包含在OEM确定的形状内。但是,如果背景是透明的,怎么会有形状呢?您可能还想问如何使一个圆形成正方形。

答案 2 :(得分:0)

转到

清单->应用程序

并更改

android:icon="@mipmap/app_icon"

android:icon="@drawable/app_icon"

答案 3 :(得分:0)

使用带有透明 XML 背景层的 Android Studio 生成启动器图标,然后从 ic_launcher.xml 中删除 ic_launcher_round.xmlres/mipmap-anydpi-v26(黑色背景)。然后,Android 将不得不回退到具有透明背景的其他版本之一(hdpi 等)。

答案 4 :(得分:-4)

只需使用8位十六进制代码 例如:80DCDCDC我长时间使用它来实现透明度