Android 不同版本下Bitmap创建差异

1.问题描述

一个雪花效果,在Android4.0以下系统正常运行,但是在Android4.1上异常退出。

2.问题定位

看一段代码

    private Bitmap		mflakeImage		= null;
    private Bitmap		mflakeImageTemp		= null;
    mflakeImageTemp = BitmapFactory.decodeResource(resources, R.drawable.snow_1);
    mflakeImage = Bitmap.createScaledBitmap(this.mflakeImageTemp, mflakeImageTemp.getWidth(),
    mflakeImageTemp.getHeight(), true);

    Log.d("cjp", "mflakeImageTemp=" + mflakeImageTemp);
    Log.d("cjp", "mflakeImage=" + mflakeImage);
    this.mflakeImageTemp.recycle();
    Log.d("cjp", "mflakeImage.isRecycled()=" + mflakeImage.isRecycled());

上面是一段简化后的代码,用于说明问题就行了:即从一张Bitmap,利用createScaledBitmap得到其另一张缩放的Bitmap,但是其实并没有缩放!

上段代码在Android4.0以下版本,mflakeImageTemp和mflakeImage是不同的两张图,但是在Android4.1上却是一张图。log如下:
4.0:
D/cjp     (21170): mflakeImageTemp=android.graphics.Bitmap@41cf0d28
D/cjp     (21170): mflakeImage=android.graphics.Bitmap@41cf32f0
D/cjp     (21170): mflakeImage.isRecycled()=false
4.1:
D/cjp     (11448): mflakeImageTemp=android.graphics.Bitmap@4179c850
D/cjp     (11448): mflakeImage=android.graphics.Bitmap@4179c850
D/cjp     (11448): mflakeImage.isRecycled()=true
所以,在4.1版本上,继续对已经回收的mflakeImage绘制雪花,就会导致异常退出


3. 为何有上述代码?
有人会问,既然没有任何缩放,为何先从一张图createScaledBitmap,然后把原图回收,这不等于绕了一圈回到原地?
没错。不过上述这份代码只是示意代码,原来的雪花效果,功能比较完善,封装比较好。它可以用一片雪花,通过设置Scale、Alpha、Rotate等参数设置,通过随机数,实现以假乱真的效果。
不过,由于我做这个的时候,设计师切了大小不同的图,就没必要进行缩放,所以我把Scale简单设置为1,而且我调试用的手机又是4.0的,所以这个问题就没有发现。


4.总结
Android SDK的每一次升级,都有一些变化(优化),当我们不清楚知道这些变化的时候,尽量审视下自己的代码,是不是会出现这种优化之后的问题。




            
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Android 不同版本下Bitmap创建差异

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭