Android 透明自适应图标背景
所以我已经在这个应用程序上工作了几个星期,我开始构建图标。我有Android Studio 3.0.1,它们似乎改变了图像资产的制作方式,现在它们有了自适应图标。我为我的应用程序制作了一个背景透明的图标。之前,我只是将形状更改为“无”,并且不会生成背景。但现在这不是一个选择,除非我去“遗产”,这是无用的。背景色似乎不支持透明度。即使在Android 透明自适应图标背景,android,Android,所以我已经在这个应用程序上工作了几个星期,我开始构建图标。我有Android Studio 3.0.1,它们似乎改变了图像资产的制作方式,现在它们有了自适应图标。我为我的应用程序制作了一个背景透明的图标。之前,我只是将形状更改为“无”,并且不会生成背景。但现在这不是一个选择,除非我去“遗产”,这是无用的。背景色似乎不支持透明度。即使在ic_launcher.xml中,我将背景设置为透明颜色,但图标仍显示为黑色背景 这是我的ic\u lancher.xml <?xml version="1.
ic_launcher.xml
中,我将背景设置为透明颜色,但图标仍显示为黑色背景
这是我的ic\u 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>
TL;DR自适应图标不能具有透明背景 透明背景将是不透明的黑色。 根据安卓8.0框架的源代码,
层本质上是不透明的;框架用不透明的黑色填充背景,如问题中所述
该框架有一个类adaptivecondrawable
,用于绘制自适应启动程序图标。
adaptivecondrawable.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);
}
}
@覆盖
公共空白绘制(画布){
if(mLayersBitmap==null){
返回;
}
if(mLayersShader==null){
mCanvas.setBitmap(mLayersBitmap);
mCanvas.drawColor(颜色:黑色);
对于(int i=0;i
简言之,实例接收要绘制的位图,并在最初使用黑色填充位图。然后前台可绘制和后台可绘制完成该工作:
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
...
}
mCanvas.setBitmap(mLayersBitmap);//重置
mCanvas.drawColor(Color.BLACK);//填满
对于(inti=0;i
这是不透明的:
0xff000000
该方法使用以下模式填充位图:
使用srcover-porterduff模式,用指定的颜色填充整个画布的位图(限于当前剪辑)
因此,背景将始终不透明,即使您将透明颜色设置为背景,如下面的屏幕截图所示(从到类似问题)
只需使用8位十六进制代码即可
示例:80DCDC im长期使用此图标以提高透明度您说过传统图标“无用”,但唯一合乎逻辑的解决方案是使用传统图标。如果您根本不创建自适应图标,Android 8.0及以上版本将不得不使用传统图标。此外,具有透明背景的自适应图标是一个矛盾的概念,因为自适应图标的主要特征是前景包含在OEM确定的形状内。但是如果背景是透明的,怎么会有任何形状呢?你可能会问如何画一个正方形。转到
清单->应用程序
改变
android:icon="@mipmap/app_icon"
到
使用带有透明XML背景层的Android Studio生成启动器图标,然后从res/mipmap-anydpi-v26
中删除ic\u launcher.XML
和ic\u launcher\u round.XML
(黑色背景的)。Android随后将不得不使用其他版本(hdpi等)中背景透明的版本。您是否检查过这个:-是的,这些版本都没有真正的帮助,正如@InsaneCat在上面提供的链接中所说:“背景绘图必须是不透明的,而前景可以包含透明度。”不幸的是,文档中没有明确说明这一点。如何将其变为白色?如果您在@color/transparent
的“res/values/color.xml”中设置#ffffffff
,它将变为白色,正如我在“更新”2中所写的那样。@Dika一些启动程序应用程序,例如,将把启动程序图标的背景颜色更改为白色为什么Android试图通过删除自身的优秀功能来模仿iOS?!这才是我真正想要的答案。谢谢Arya Danesh。你节省了我的时间。请有人解释为什么这个答案在下面,用两行解释如何解决这个问题。
android:icon="@mipmap/app_icon"
android:icon="@drawable/app_icon"