Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 透明自适应图标背景_Android - Fatal编程技术网

Android 透明自适应图标背景

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

所以我已经在这个应用程序上工作了几个星期,我开始构建图标。我有Android Studio 3.0.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"