透明的自适应图标背景

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

这是我的ic_lancher.xml

      

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

 #00000000 

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

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

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

除了动态创建之外,还可以使用标签通过XML膨胀创建此类。

AdaptiveIconDrawable.java中方法draw 的源代码是:

 @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模式使用指定的颜色填充整个canvas的位图(限制为当前剪辑)。

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

NoAdaptive和Adaptive

只需使用8位hex代码示例:80DCDCDC即时使用它可以获得透明度