ImageView中使用setImageResource部分机型展示不出图片

      项目中涉及新功能的版本上线大多会涉及新手引导页,看似功能很简单,但是android机型众多,偏偏会出幺蛾子。

      最近遇到这样的问题,在小米4和摩托罗拉XT1085两款手机上新手引导页(或者是开机启动页)展示不出来,其他手机显示正常,原因是图片太大了(项目中的图片是90KB)。

以下用demo做示范,可重现项目中的问题

private ImageView img;
	@Override
	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),则可正常显示。

android图片dialog android图片显示不出来_内存溢出

但是具体为什么这两款机型中当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

具体使用过程:

.webp格式;

android图片dialog android图片显示不出来_ImageView_02

 2、转换好的图片可以使用google chrome浏览器打开,查看图片是否正常展示;

 3、*.webp图片替换工程中相应drawble下的.png图片(删掉*.png,直接使用*.webp即可)


总之,上述3中方法都是不同方式的把png图片进行压缩再进行展示,具体个别手机上会出现这种问题的原因还有待研究。