android - drawable在分辨率不正确时消失

时间:2017-05-07 08:18:43

标签: android android-drawable android-resources

我有一个名为background.xml

的可拖动的drawable
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape>
        <gradient
            android:angle="90"
            android:startColor="@color/gradient_bottom"
            android:endColor="@color/gradient_top"
            android:type="linear" />
    </shape>
</item>
</selector>

当xml在drawable文件夹下时,在一些可重现的情况下(不确定为什么,可能与高内存消耗有关),背景消失了。

但是,当我重新创建场景并在所有可绘制分辨率文件夹中放置相同的xml时,背景不会消失(即drawable-hdpi,drawable-xhdpi等)

这种事情不应该发生, 有人可以解释为什么会发生这种情况以及如何更优雅地解决它?

P.S -

  1. 当我把纯色作为背景时,这个问题并没有发生

  2. 自定义按钮背景也会出现问题,并且在将自定义背景放入可绘制分辨率文件夹时修复

1 个答案:

答案 0 :(得分:1)

我建议尽可能使用带有dpi限定符的资源目录。否则,您可以使用某些设备获得OutOfMemory错误。这里的解释:

  

默认情况下,Android会缩放您的位图drawables(.png,.jpg和.gif文件)和Nine-Patch drawables(.9.png文件),以便它们在每个设备上以适当的物理大小呈现。例如,如果您的应用程序仅为基线(中等屏幕密度(mdpi))提供位图可绘制,则系统在高密度屏幕上进行缩放,并在低密度屏幕上缩小它们。此缩放可能会导致位图中的伪像。为了确保您的位图看起来最好,您应该为不同的屏幕密度添加不同分辨率的替代版本。

  

在运行时,系统会确保在当前屏幕上以最佳方式显示任何给定资源的以下过程:

     

系统使用适当的替代资源   根据当前屏幕的大小和密度,系统使用应用程序中提供的任何特定大小和密度的资源。例如,如果设备具有高密度屏幕并且应用程序请求可绘制资源,则系统会查找与设备配置最匹配的可绘制资源目录。根据可用的其他备用资源,具有hdpi限定符的资源目录(例如drawable-hdpi /)可能是最佳匹配,因此系统使用此目录中的可绘制资源。

     

如果没有可用的匹配资源,系统将使用默认资源并根据需要向上或向下扩展以匹配当前屏幕大小和密度   &#34;默认&#34;资源是那些未使用配置限定符标记的资源。例如,drawable /中的资源是默认的可绘制资源。系统假定默认资源是针对基线屏幕尺寸和密度设计的,这是正常的屏幕尺寸和中等密度。因此,系统会根据需要为高密度屏幕缩放默认密度资源,为低密度屏幕缩小默认密度资源。   但是,当系统查找特定于密度的资源但未在密度特定的目录中找到它时,它不会总是使用默认资源。系统可以改为使用其他密度特定资源中的一个,以便在缩放时提供更好的结果。例如,当寻找低密度资源并且它不可用时,系统倾向于缩小资源的高密度版本,因为系统可以轻松地将高密度资源缩放到低密度资源。与将中等密度资源缩放0.75倍相比,因子为0.5,伪影更少。

Source