思想不退步,每天有進步。大傢好,我是Unity集結號,希望每次能給大傢帶來不一樣的知識幹貨。
什麼是全面屏適配?
自全面屏問世後,劉海屏,水滴屏,到現在的折疊屏,模糊概念裡這些都屬於全面屏,市面上的android手機分辨率,樣式層出不窮,這樣就衍生出一個問題,如何有一套統一的屏幕適配方案?
小米mix2 全面屏
iphonex 劉海屏
meta20x-水滴屏
從三幅圖中,是否可以大致看出,頂部的位置是不可用的,這時一個很自然的想法是,我如果知道距離頂部的距離,那麼問題不就迎刃而解瞭,如下圖:
劉海屏示意圖
頂部紅色區域是不可用的,或者說,頂部區域要謹慎使用,但是市面上的手機千奇百怪的,這麼多分辨率,這麼多樣式,不可能一一進行適配,那麼怎麼辦呢?這個時候就引入瞭一個新的概念,安全區域。
什麼是安全區域?
從上圖中我們可以看出,底部綠色區域就是我們所謂的安全區,這裡怎麼排佈界面元素都不會出現遮擋問題,那麼如何獲取這部分的信息呢?
Unity中內置瞭這麼一個api叫Screen.safeArea,也就是裡面能獲取安全區域的范圍
Device Simulator示意圖
position和size構成瞭安全區的一個范圍,那麼我們就能針對不同分辨率有同一個入口
手遊開發如何設計基準分辨率?
為什麼要設計基準分辨率,一般手遊開發過程中,是小屏適配大屏,為什麼需要這樣?
1,如果我們使用目前市面上最大的屏幕去適配小屏幕的話,元素往中間擠壓,重疊。
想象一樣,一個壯漢要過一個宅門,得不斷地擠壓自己的身體,變形,才有可能穿過去,那麼這個壯漢滿臉通紅,提臀收腹的樣子,就形似界面的元素擠壓。
2,如果我們用很小的屏幕適配大屏幕不就行瞭,肯定不會擠壓,那麼會出現什麼問題呢?
屏幕上元素的初始尺寸很小,在大屏幕上,就會出現放大的效果,界面就會變得模糊。
3,那麼怎麼樣選取基準分辨率呢?
項目立項初期,就要調查市面上主流機型的分辨率, 16:9, 18:9, 13:6
16:9代表 1280 * 720(小米2s), 1920 * 1080 (iphone 6s plus), 750 * 1334 (iphone 6s)
18:9代表 2160 * 1080 (小米MIX)
13:6代表 2436 * 1125 (iphone x, iphone xs)
從上面可以看出,選擇16:9作為基礎分辨率是比較好的。
代碼如何實現適配?
1,設置一個和Canvas同等大小的panel, 可以命名為safePanel
2, 設置錨點的位置
var safeArea = Screen.safeArea;var anchorMin = safeArea.position;var anchorMax = anchorMin + safeArea.size;anchorMin.x /= Screen.width;anchorMin.y /= Screen.height;anchorMax.x /= Screen.width;anchorMax.y /= Screen.height;m_safeRect.anchorMin = anchorMin;m_safeRect.anchorMax = anchorMax;其實就是將anchor設置為安全區的左下和右上點
掀開折疊屏的神秘面紗
華為折疊屏,合起來的時候,是一部正常的手機,展開之後,就是一個類似pad的大小4:3,那麼顯而易見,我們要再折疊的時候適配手機,展開之後適配pad,如果項目已經成型之後,如何適配pad呢?
1,ipad的話,不會改變尺寸,而且可以通過SystemInfo.deviceModel,獲取設備名稱看是否是ipad, 本身是橫屏遊戲的話,這個時候可以使用豎屏遊戲或者 width-height一半的位置適配,根據自己的項目需要
ipad適配策略
2,如果是華為折疊屏這種變化的,使用華為的EasyGo SDK提供的isFoldable(),getDisplayMode()判斷是否為折疊屏展開態,展開和關閉可以通過sdk層進行通知,然後刷新unity,重新適配。
總結
屏幕適配本質上就是在合適的區域放置ui元素。
最後希望喜歡我的小夥伴關註我,也可以評論,私信我,提出寶貴的意見,我會不斷改進,和大傢一起成長,也會挑選出一些小夥伴比較關心的主題,作為專題進行講解,希望大傢多多支持
請先 登入 以發表留言。