Ответ 1
TL; DR Адаптивные значки не могут иметь прозрачный фон
Прозрачный фон будет непрозрачным черным.
Согласно исходному коду платформы Android 8.0, слой <background>
по своей природе непрозрачен; как уже упоминалось в вопросе, рамки заполняют фон непрозрачным черным.
Фреймворк имеет класс AdaptiveIconDrawable
, который рисует иконки адаптивного запуска.
https://developer.android.com/reference/android/graphics/drawable/AdaptiveIconDrawable.html
Элемент <adaptive-icon>
создает его экземпляр:
Этот класс также может быть создан с помощью XML-инфляции с использованием тега
<adaptive-icon>
в дополнение к динамическому созданию.
Исходный код метода 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);
}
}
Короче говоря, экземпляр Canvas получает растровое изображение для рисования и изначально заполняет растровое изображение черным цветом. Затем рисуем передний план и рисуемый фон:
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.
Таким образом, фон всегда будет непрозрачным, даже если вы установите прозрачный цвет фона, как на скриншоте ниже (из моего ответа на аналогичный вопрос).