【问题标题】:android decodeResource returns null for xml bitmap - API level 7android decodeResource 为 xml 位图返回 null - API 级别 7
【发布时间】:2015-04-09 21:14:25
【问题描述】:

我有一个奇怪的情况:在将我的 PNG 从 /drawable-hdpi/ 移动到 /drawable/ 并将 XML 位图放到 /drawable-hdpi/ 之后,我无法使用 BitmapFactory.decodeResource() 方法解码这些位图 - 它返回null。 更奇怪的是:

  1. 我可以用这种方法解码实际的 png 文件(给出实际的可绘制 id)
  2. 我可以使用context.getResources().getDrawable(xml_id) 获取drawable -
  3. 所有 ImageViews 组件都已正确解码(但那是由于我想的第 2 页)

我在 logcat 中看到的是:

12-03 16:18:13.557: D/skia(2566): --- SkImageDecoder::Factory 返回 null
12-03 16:18:13.557: D/skia(2566): --- SkImageDecoder::Factory 返回 null
12-03 16:18:13.567: D/skia(2566): --- SkImageDecoder::Factory 返回 null

所以我会大胆猜测解码器被赋予了要解码的 xml 文件而不是实际资源(我检查过它是有效的)。

有什么提示吗?是否可以使用 xml 位图 BitmapFactory.decodeResource()? 顺便说一句,我使用的是 API 7。

我还尝试将原始 lpng 放入 drawable-nodpi 中,但这也无济于事。 谢谢

【问题讨论】:

    标签: android


    【解决方案1】:

    获取drawable,然后转换为Bitmap:

    Drawable drawable = getResources().getDrawable(resId);
    Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
    

    现在您可以使用 Bitmap 对象了。

    【讨论】:

    • 我收到一个错误:android.graphics.drawable.StateListDrawable cannot be cast to android.graphics.drawable.BitmapDrawable
    • getDrawable(resId) 已被弃用。请改用ContextCompat.getDrawable(context, resId)
    • 在 Kotlin 中,Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); 变成了什么?
    【解决方案2】:

    XML 位图是在 XML 中定义的指向位图文件的资源。效果是原始位图文件的别名。 XML 可以为位图指定其他属性,例如抖动和平铺。

    http://developer.android.com/guide/topics/resources/drawable-resource.html

    我遇到了同样的问题,但我将其用作解决方法。不幸的是,使用这种方法,当您解码流时,我看不到任何传递选项的方法。

                //init input stream
        is = getContext().getResources().openRawResource(resID);
    
        Bitmap returnBitmap;
    
        //Load bitmap directly - will fail if xml
        Bitmap newBmp = BitmapFactory.decodeStream(is, options);
        if(newBmp == null){
            //Load bitmap from drawable auto scales
            newBmp = ((BitmapDrawable) getContext().getResources().getDrawable(resID)).getBitmap();
        }
    

    【讨论】:

      【解决方案3】:

      到底什么是 XML 位图? BitmapFactory.decodeResource() 加载位图图像 - 您应该使用 PNG 或 JPEG 图像,仅此而已。

      请停止向 -hdpi 和 -nodpi 或其他任何东西扔随机的东西。对于给定的资源名称,所有不同的 dpi 限定符或诸如此类的东西对同一事物提供不同的变体。您不应该让其中一些是位图,而其中一些是 XML 文件,将 -nodpi 与其他变体混合也没有任何意义。

      【讨论】:

      • 好吧,也许我使用了不正确的表达方式,这意味着 XML 中的别名资源 ID 请参阅:[link]developer.android.com/guide/topics/resources/…
      • 好的,我明白了,decodeResource() 没有检查资源是PNG还是别名的逻辑,它只是解码,可惜。
      • 确实应该是drawable文件夹中的普通png文件。 xml 文件将不起作用。你救了我很多。我花了好几个小时才达到这个目标
      【解决方案4】:

      尝试将 xml 位图链接到另一个 xml 位图时也会出现此错误

      <bitmap
        android:src="@drawable/glow"
        android:tileMode="disabled" android:gravity="center" >
      </bitmap> 
      

      其中“glow”是另一个 xml 位图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-17
        • 2013-05-28
        • 2012-08-02
        • 1970-01-01
        • 2023-03-18
        • 2011-09-19
        • 2013-08-09
        相关资源
        最近更新 更多