项目中涉及新功能的版本上线大多会涉及新手引导页,看似功能很简单,但是android机型众多,偏偏会出幺蛾子。
最近遇到这样的问题,在小米4和摩托罗拉XT1085两款手机上新手引导页(或者是开机启动页)展示不出来,其他手机显示正常,原因是图片太大了(项目中的图片是90KB)。
以下用demo做示范,可重现项目中的问题
1 2 3 4 5 6 7 8 | private ImageView img; protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); img = (ImageView) findViewById(R.id.img); img.setImageResource(R.drawable.istrategy_create_select_chengfen); //未做处理前是90KB,UI做压缩后是60KB } |
上述代码很简单,在很多机型上都可以正常运行达到效果,但小米4和摩托罗拉XT1085上则无法显示。
解决方法一:
drawable下的图片istrategy_create_select_chengfen.png,让UI人员把图片从90KB进行了压缩(60KB),则可正常显示。
但是具体为什么这两款机型中当png过大时显示会有问题,未找到相关资料,猜测跟手机本身系统对图片占内存大小,防止内存溢出做了控制。
解决方法二:
使用img.setImageBitmap展示图片,即:
img.setImageResource(R.drawable.istrategy_create_select_chengfen);改为img.setImageBitmap(bitmap);
具体png转bitmap的方法网上有很多,不再介绍。
最简单是就是Bitmap bitmap = BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.istrategy_create_select_chengfen);
img.setImageBitmap(bitmap);
但是需要注意decodeResource方法容易发生OOM内存溢出。
解决方法三:
google新推出的一种图片格式.webp,webp格式的图片比png图片占用空间小,但是需要android4.0以上支持,4.0以下需要导入.so。如果项目是与C交互的,可以考虑用此方法。
.webp相关知识可参考: http://www.cnblogs.com/tianzhijiexian/p/4398540.html
具体使用过程:
1、下载iSparta软件,选择*.png文件,转换成*.webp格式;
2、转换好的图片可以使用google chrome浏览器打开,查看图片是否正常展示;
3、*.webp图片替换工程中相应drawble下的.png图片(删掉*.png,直接使用*.webp即可)
4、工程代码中仍旧使用img.setImageResource(R.drawable.istrategy_create_select_chengfen);即可
总之,上述3中方法都是不同方式的把png图片进行压缩再进行展示,具体个别手机上会出现这种问题的原因还有待研究。