在簡書搜索 全面屏適配,能夠找出一大堆結果,這篇筆記再也不多說已經有的理論知識,你們參考最多的資料也貼在文章的最後了,主要內容記錄最近在開發中遇到的冷啓動佔位圖splash適配全面屏的問題。html
左邊是一加5T,右邊是一加5(這裏劉老闆請給我廣告費) android
經過資料,7.0以上是默認適配全面屏了, 適配6.0的全面屏機器,將ratio_float設置爲2.1以上便可bash
<meta-data android:name="android.max_aspect"
android:value="ratio_float"/>
複製代碼
這些你們都已經知道了。app
一樣的,SplashActivity放一張bg_splash佔位圖,而後當有廣告的時候再貼一張廣告圖覆蓋在上邊。這個業務也是業內統一的作法。ui
當時drawable-xxhdpi裏放的bg_splash是16:9的圖,不出所料的出現了圖片被上下拉伸的結果。 而給來的廣告圖url(比例也是16:9),進行了scaleType=centerCrop的縮放, 平時能夠作到的 底部logo看起來沒有變化的效果,如今明顯有了差別url
緣由: 不論16:9仍是18:9,佔位圖都是去本地drawale文件找,18:9的基本上都是xxhdpi了,16:9不必定,由於這個比例與dpi無關。 暫且咱們都以xxhdpi爲例,18:9的機器找本地bg_splash,找到了drawable-xxhdpi的資源,而這個文件夾裏只放着原先比例爲16:9的圖,系統加載圖片時會自動上下拉伸。spa
解決方案 第一次嘗試的時候,是增長了drawable-long資源文件夾,可是出現了RuntimeException.net
因此最後採用增長drawable-xxhdpi-2016x1080資源文件夾 drawable-xxhdpi-2016x1080是怎麼來的呢? 來自官方文檔的翻譯 其中有一段對限定符的描述 翻譯
我當時立刻就新建了一個 drawable-xxhdpi-1080x2160的文件夾,把18:9的bg_splash.jpg丟進去。 結果一加5T仍是去找xxhdpi的資源,而後發現應該height x width 從新建 drawable-xxhdpi-2160x1080文件夾,仍是不行.... 我發現了 可用分辨率這個參數,文件夾改爲 drawable-xxhdpi-2034x1080,完美找到18:9的圖,全面屏的啓動圖無需上下拉伸16:9的圖了。3d
爲了適配更多的全面屏機型,將比例降到1.86,也就是2016x1080.
解決了本地圖片被強行上下拉伸的問題後,18:9的機器也能乖乖的顯示splash佔位圖了,但是給來的廣告圖仍然是16:9,像素是2160x1215,不是說進行了scaleType=centerCrop的縮放麼,還會出問題麼?
會....由於16:9的圖放在16:9的機器上,不須要縮放,直接填充滿就好了,只有放在全面屏上才須要去裁剪。
本覺得去掉ImageView的scaleType就行了,然而並無什麼用,看了下源碼,
那我就加個判斷嘛
if (1.00d * ScreenUtil.screenHeight / ScreenUtil.screenWidth > 1.84d) {
adsImage.setScaleType(ImageView.ScaleType.CENTER_CROP);
} else {
adsImage.setScaleType(ImageView.ScaleType.FIT_XY);
}
複製代碼
只有在屏幕比例符合全面屏的時候纔去裁剪,不然都用fill的方式填充。
附上無需context便可拿到屏幕參數的代碼
DisplayMetrics dm = Resources.getSystem().getDisplayMetrics();
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels;
複製代碼
至此,全面屏的啓動頁/廣告圖適配已經完成。
###總結 1.ratio_float設置爲2.1,兼容6.0機器; 2.新增drawable-xxhdpi-2034x1080資源文件夾放18:9的佔位圖; 3.判斷屏幕比例再選擇縮放方式; 4.最佳解決方案就不使用一整張佔位圖,而是參考網易嚴選的方案 bg_spalsh是layer-list,底色全白,加上一個slogen的png圖,這個slogen圖marginBottom=43dp
參考資料: 1.關於Android的像素相關知識
4.全面屏時代 | APP如何快速適配? 這4個關鍵點你要知道!