項目中涉及新功能的版本上線大多會涉及新手引導頁,看似功能很簡單,但是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),則可正常顯示。
但是具體為什么這兩款機型中當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圖片進行壓縮再進行展示,具體個別手機上會出現這種問題的原因還有待研究。