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

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

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

1
2
3
4
5
6
7
8
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部分机型ImageView.setImageResource加载大图显示不出来-LMLPHP

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

Android部分机型ImageView.setImageResource加载大图显示不出来-LMLPHP

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

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

 4、工程代码中仍旧使用img.setImageResource(R.drawable.istrategy_create_select_chengfen);即可
 

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

 
标签:   Android,   ImageView,   setImageResource
03-09 06:54