所以我已经在这个应用程序上工作了几个星期,我开始构建图标.我有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>
Run Code Online (Sandbox Code Playgroud)
和ic_launcher_round.xml是一样的.这@color/transparent是一个:
<color name="transparent">#00000000</color>
Run Code Online (Sandbox Code Playgroud)
根据Android 8.0框架的源代码,该<background>层本质上是不透明的; 如问题所述,框架用不透明的黑色填充背景.
该框架有一个类AdaptiveIconDrawable,它绘制自适应启动器图标.
https://developer.android.com/reference/android/graphics/drawable/AdaptiveIconDrawable.html
该元素<adaptive-icon>创建它的一个实例:
<adaptive-icon>除了动态创建之外,还可以使用标记通过XML膨胀创建此类 .
的源代码的方法的draw在AdaptiveIconDrawable.java是:
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
简而言之,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
...
}
Run Code Online (Sandbox Code Playgroud)
该Color.BLACK是不透明的:
0xff000000
drawColor方法使用SRC_OVER模式用它填充位图:
使用srcover porterduff模式使用指定的颜色填充整个画布的位图(限制为当前剪辑).
因此,即使您将透明色设置为背景,背景也总是不透明的,如下面的屏幕截图所示(从我对类似问题的回答).

去
清单 -> 应用程序
和改变
android:icon="@mipmap/app_icon"
Run Code Online (Sandbox Code Playgroud)
到
android:icon="@drawable/app_icon"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8149 次 |
| 最近记录: |