BitmapFactory.decodeFile()方法解析出的Bitmap导致Canvans.setBitmap()触发异常

遇到的问题

先贴问题代码:

 public void setmBitmap(String path){
        mBitmap = BitmapFactory.decodeFile(path); //这里有错
        mCanvas.setBitmap(mBitmap);
        invalidate();
    }

就是这段小小的代码,让我调试了两个钟头,(哭...

分析

调试一下就会发现问题,直接上图:

image.png

有一个Bitmap.isMutable()方法,那这个方法代表着什么呢?
官方给的解释:
Returns true if the bitmap is marked as mutable (i.e. can be drawn into)
返回这个Bitmap是否可以被绘制。
也就是说Bitmap里面一个boolean的变量,标志着是否能够绘制该Bitmap。

简单查看一下源码就能得到一个变量:
private final boolean mIsMutable;
也就是说,通过BitmapFactory.decodeFile()方法得到的bitmap是一个无法被绘制的。
问题已经找出来了,那就自然而然的能解决啦!


解决

既然是因为bitmap的内部字段mIsMutable为false导致的,那我们就改变一下这个变量的值,让它变为true。
通过查询,使用Bitmap.copy()方法

image.png

这个方法返回一个新的Bitmap,只需要把第二个参数设置为true:
mBitmap = BitmapFactory.decodeFile(path).copy(Bitmap.Config.ARGB_8888, true);
问题就解决啦

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,466评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,981评论 19 139
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,946评论 0 15
  • 关于这个问题在面试的时候可能会被问到,其实在某些情况下是可以在子线程中更新UI的! 比如:在一个activity的...
    Richair_Ann阅读 9,566评论 5 13
  • 王二醒来时是在考场边上的一家客栈新,店小二喊醒了他。店小二告诉他,有两个女的把他送到这里并吩咐几点叫醒他,听店小二...
    常做客阅读 185评论 0 0