的時候看到一些3D游戲鋸齒感特別明顯,與一些開發者溝通后發現,其實很多人并不清楚怎么能去掉明顯的鋸齒感,而這并不是只有新開發者才遇到的問題,很多游戲研發經驗豐富的開發者,甚至是使用LayaAir引擎開發了很多游戲的開發者也會不清楚。另外,最近也遇到有開發者想了解劉海屏如何適配,所以通過本篇文章全面介紹一下。
為了兼顧新手開發者來理解這個事,本篇從基礎概念入手,詳細介紹LayaAir引擎的各個屏幕適配縮放模式,劉海屏適配思路,以及如何有效的抗鋸齒。
以下基礎概念非常重要,會影響到后面引擎適配原理的理解,請大家認真閱讀。
物理分辨率簡單理解就是硬件所支持的分辨率,以像素(px)為單位,所以我們稱這個硬件上的每一個像素點為物理像素,也叫設備像素。將屏幕實際存在的像素以行數 × 列數這樣的數學表達方式體現出來,就是物理分辨率。比如 iPhone8 的物理分辨率是1334 × 750 。而我們進行屏幕適配時,表達方式會有所不同,會以屏幕寬的像素數量 × 屏幕高的像素數量這樣來體現。例如 iPhone8在默認的豎屏狀態下,物理分辨率表達為750 × 1334。橫屏狀態下,物理分辨率表達為1334 × 750 。所以大家需要能理解這些區別。
iOS繪制圖形是以 point (pt)為單位,在早期的時候1 point=1 pixcel。在2010年推出的iPhone4開始采用 Retina(視網膜) 屏幕顯示技術 ,物理分辨率提升了4倍,此時,如果iPhone4還是1pt=1px這個方案,將會導致如下圖一樣的顯示效果。
(圖1)
在圖1中,按 iPhone3GS的320 × 480進行全屏設計,那在iPhone4下的顯示效果則如圖1左側,原來的滿屏內容只占了四分之一,其余部分留空。而按iPhone4分辨率 640 × 960進行全屏設計,那在iPhone3GS的屏幕下顯示效果則如圖1右側,大量內容超出可顯示區。
很顯然,apple不會讓圖1的事情發生。實際上,iPhone4的縮放因子為@2X,也就是在這個機型上1個point 用2×2的像素矩陣來表示,如圖2中效果所示,完美解決圖1中可能發生的問題。
(圖2)
隨著時代的發展,后續的機型物理分辨率也越來越高,1個point占用的物理像素也越來越多,見下圖。
(圖3)
縮放因子的概念在安卓機型中也適用
邏輯分辨率簡單理解就是軟件所使用的分辨率,我們設計適配全靠他,也是用乘法數學表達方式來體現。為了更好的理解這個概念,我們先看一組數據表格。
(圖4)
通過圖4的數據,我們可以看出,隨著手機設備的更新,物理分辨率已經越來越高,如果我們按物理分辨率來進行屏幕適配,先不算安卓,光iPhone的機型就很碎片化了,還好,在縮放因子的作用下,我們看到邏輯分辨率基本上變化不大,所以我們后面講的引擎適配,主要是針對邏輯分辨率進行適配。
我們基于瀏覽器開發時,之前介紹的縮放因子概念對應的是DPR (Device Pixel Ratio),中文叫設備像素比 。LayaAir引擎中通過 Laya.Browser.pixelRatio 可以獲得瀏覽器的DPR值。
這里稍展開講幾句,在瀏覽器里,默認是由用戶來控制縮放的,例如,我們在手機瀏覽器雙指擴張,發現網頁會放大,但清晰度并不減小。這就是用戶自主縮放導致,并非是由DPR值來決定縮放。如果我們想和APP開發那樣,通過邏輯分辨率來適配,讓瀏覽器依據設備的DPR來決定一個CSS像素占用幾個物理像素。那需要在入口HTML頁面的的meta標簽中用 viewport進行了相關的配置。代碼如下:
<meta name='viewport' content='width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no'/>
以上代碼LayaAir引擎中默認添加,并強制添加不得刪除。
通過上面這段viewpot的配置,那頁面在禁止用戶手動縮放的同時,也會按設備的DPR進行自動縮放。
邏輯寬高是指邏輯分辨率的寬高。瀏覽器里,可以縮放的邏輯分辨率像素是CSS像素,在設置了viewport的情況下,瀏覽器會根據DPR的值決定一個CSS占用多少個像素,例如DPR為3時,1個CSS像素就占用3×3個物理像素。
LayaAir引擎里可以通過Laya.Browser.clientWidth獲取邏輯分辨率的寬,通過Laya.Browser.clientHeight獲取邏輯分辨率的高。
在手機等移動設備的豎屏狀態下,窄面為寬,長面為高。如果發生了屏幕翻轉的橫屏狀態,則長的一面為寬,窄面為高。
在PC瀏覽器中,則是獲取的瀏覽器窗口可視寬高。
物理寬高對應的是之前介紹的物理分辨率概念,在LayaAir引擎的一些API注釋里也寫作屏幕寬高,其實是一回事。開發者可以通過引擎封裝的接口獲得寬高值,通過Laya.Browser.width可以得到物理寬,通過Laya.Browser.height可以得到物理高。
不過,需要特別說明的是,LayaAir引擎中的物理寬高是通過邏輯寬高*DPR計算而來。而奇葩的iPhone6/7/8各Plus機型,邏輯分辨率是736×414,DPR的值是3,相乘得到的結果顯然與真實的各Plus機型物理分辨率1920×1080不符合。
講到這里,開發者了解到有這回事即可,不用擔心適配錯誤,由于LayaAir引擎在入口網頁的meta標簽中用 viewport進行了相關的配置,所以會按DPR自動進行縮放,最終會自動縮放到對應到實際的物理分辨率。
至于Plus機型為什么要這樣奇葩的設置,這里就不展開講了,有興趣的同學可以自行百度搜索答案。
設計寬高是開發者在設計產品時采用的寬高,面對眾多機型,選擇哪個作為設計寬高,也是一些新手開發者有點迷茫的,這里簡單多說幾句。
(圖5)
設計寬高,首先要考慮的是優先兼容多數的常用屏幕比例。通過上面圖5的表格,我們看到去掉過時的機型,基本上手機屏幕就分兩類,一類是寬高比約為1:1.78的非全面屏手機,另一類是寬高比約為1:2.17全面屏手機。各品牌的安卓機型屏幕比例,大多也是這兩種或者接近這兩種。
基于性能優先的原則,通常開發者都會選擇分辨率小一些的作為主效果設計,然后向其它比例屏幕進行適配。比如:常見的寬750高1334或寬720高1280。
以上寬高描述是指豎屏模式設計,橫屏需反過來。
在LayaAir引擎里,初始化引擎的init(寬,高)值對應的就是設計寬高。如Laya.init(750, 1334);。
打開LayaAirIDE,通過F9快捷鍵調出的面板里,可以直接設置,效果如圖6所示。
(圖6)
眾所周知,<canvas>是HTML5中的畫布,其 width、heigth 屬性就是畫布寬高。
畫布寬高在noscale、exactfit、noborder這幾個LayaAir引擎適配模式下會直接采用設計寬高值,其它適配模式下,會根據適配規則產生變化。畫布寬高的值對畫面最終的清晰度以及性能都會產生影響,甚至邊緣鋸齒或畫面模糊也與此處畫布寬高值有關。
我們在IDE里任意發布運行一個頁面, 在打開的chrome里用F12進入調試模式后,入口頁面中找到id為 layaCanvas的canvas標簽。記住這個位置,圖7中紅圈標記的,就是畫布的寬高,后面理解屏幕適配模式的時候,大家可以多關注這里。
(圖7)
由于Canvas是基于位圖像素繪圖的,畫布寬高對畫面質量及性能有影響,又或者諸如plus特殊的分辨率等問題。所以不能通過直接改變畫布寬高來適配,否則會出來一些適配問題。在LayaAir引擎中會根據不同的適配模式規則,計算出適配寬高需要縮放的比例,然后通過transform的matrix(矩陣)來對畫布縮放至邏輯分辨率范圍內,再通過viewport與DPR機制縮放還原。
基于以上種種,我們需要了解適配寬高這個概念,適配寬高才是適配規則處理后的最終效果寬高,會直接影響通過DPR還原后的最終效果。
大家在理解各個適配模式的時候,可以在HTML入口頁面中觀察畫布寬高與transform的matrix(矩陣)縮放效果來對比不同模式之間的差異。例如圖8中紅圈標記所示,適配寬高分別為249.99975和444.666222。還原至物理分辨率大小后,雖然有精度上的細微損失,但已經很難看出。
(圖8)
舞臺寬高是指LayaAir引擎的stage寬高,stage寬高的變化并不會影響到畫面的大小,但stage范圍內,可以控制顯示,可以進行事件監聽,碰撞檢測等,所以stage寬高的適配還是非常重要的。
在不同的屏幕分辨率比例下,總會有適配規則不能覆蓋到,難以做到既想等比縮放,又想在各種屏幕下都做到游戲內容滿屏顯示。但其實上,只要舞臺寬高可以占滿全屏,那就一定可以做到各屏幕全屏顯示。因為,游戲的顯示與控制就是基于舞臺的,舞臺全屏就有了在適配的基礎上調整顯示的空間,畢竟不可能超出舞臺來顯示游戲內容。
默認情況下,stage寬高直接等于設計寬高。在full、fixedwidth、fixedheight、fixedauto的適配模式下,stage寬高會根據適配規則產生變化。
由于講layaAir引擎的適配模式會涉及到useRetinalCanvas屬性設置,所以我們先了解一下抗鋸齒相關。
在微信安卓7.0.3版本前,微信安卓小游戲會將畫布強制設置為物理分辨率,后在7.0.3取消了強制更改畫布,但會將畫布拉伸至物理屏幕的全屏顯示,所以當時還導致很多適配模式沒有使用正確的開發者,紛紛出現畫面模糊的表現。這就是因為畫布達到物理分辨率大小才是真高清,拉伸會變模糊,比例不是相差太大的圖片還好些,尤其是文字更為明顯。
另外,由于微信小游戲與瀏覽器的繪制差異問題,在某些適配模式下,可能會出現適配問題,比如頂部出現留底問題等。而在OPPO和vivo等小游戲平臺,如果畫布不采用物理分辨率模式一定會出現適配問題,所以對于小游戲平臺,我們建議開啟引擎的視網膜畫布模式。
一旦開啟后,引擎將無視設計寬高大小,強制把畫布寬高設置為物理分辨率的大小。這樣就保障了畫布的最佳顯示效果。
開啟的方式有兩種,一種是在初始化舞臺之前,也就是init()之前添加一行配置代碼。代碼如下:
//使用視網膜畫布模式,在init之前使用
Config.useRetinalCanvas=true;
如果想動態控制視網膜畫布模式的開和關,也可以用另一種設置模式,在init()之后添加配置代碼。代碼如下:
//使用視網膜畫布模式,在init之后使用
Laya.stage.useRetinalCanvas=true;
一旦開啟視網膜畫布模式后,有的開發者會比較擔心性能問題,畢竟采用物理分辨率作為畫布寬高后,代表著畫布上的像素可能會比原有設計寬高要多,這的確會對性能產生影響。但絕對沒有想象中差距那么大,尤其是越高分辨率的機型,通常硬件條件也會更好一些。根據我的推薦,一些開發者調整之后,事實上也沒有太大的影響。
更何況,可以通過判斷機型或分辨率,進行動態控制視網膜畫布模式的開關。也有的開發者,在一些壓力比較大的頁面上關閉視網膜畫布模式,其它頁面開啟視網膜畫布模式。
我們屏幕的像素點,是由行與列的矩陣序列組成。也就是說屏幕中是不存在斜線的?;谙袼乩L圖的畫布,要是畫橫豎的直線,那絕對是相當的平滑。可是畫曲線和斜線怎么辦。只能是由兩個相鄰的像素點不斷重復延申組成,如果這句話不好理解,我們想象一下樓梯,從側面去看,大概就是這個樣子。
另外,3D模型的基礎構成是三角面組成的多邊形網格,繪制3D多邊形構成的模型,這和我們矢量畫斜線、畫曲線、畫圓,是一樣的道理。所以非矩形的矢量圖形和3D模型,產生鋸齒這是正常的。當然LayaAir引擎內置了抗鋸齒方法,并且在3D庫中默認開啟了,2D想開啟的話可以在init()之前加入Config.isAntialias=true;。
開啟抗鋸齒后,邊緣鋸齒會變的平滑模糊,示意效果如圖9所示。
(圖9)
模糊后的鋸齒相對會平滑一些,在像素密度比較高的屏幕上,肉眼很難看出。從而達到消滅鋸齒感的目標。
如果抗鋸齒在開啟狀態下,發現仍然是無效的。那就需要檢查是不是使用了相機的HDR或者后期處理。webGL 1.0不支持renderTarget有抗鋸齒,所以想避免鋸齒感的,要在Unity里導出資源時,不要勾選HDR相關選項?;蛘咧苯釉谝胬铮瑒摻ㄏ鄼C后關閉HDR。示例代碼如下:
this.camera=new Laya.Camera(0, 0.1, 100);
this.camera.enableHDR=false; //關閉HDR
開發者對于后期處理使用的不多,想避免鋸齒感的,那后期處理也不要使用了。通常導致抗鋸齒失效的原因就是HDR。
如果說抗鋸齒有效的情況下,還是有鋸齒感,那就是和畫布大小有關了,我們先看圖10中的效果。
(圖10)
在圖10左側,是畫布物理寬高一致的情況下,畫布像素與物理像素是重合的。圖10右側,當畫布寬高小于物理寬高時,被適配規則將畫布拉伸至全屏后,導致的畫布像素與物理像素產生偏差錯位。這就是加重邊緣鋸齒的根本原因,導致引擎抗鋸齒功能也很難完全消除過于明顯的鋸齒現象。
所以解決辦法就是使用物理分辨率的適配模式,或者在當前適配模式的基礎上,開啟視網膜畫布模式,將畫布強行按物理分辨率進行設置。
這樣一來,在有效的扛鋸齒開啟以及物理寬高的畫布雙重保障下,鋸齒感就很難在手機屏幕上察覺了。
LayaAir引擎的適配模式有8種,為了讓大家真正理解各適配模式的適配策略,以便更好的進行屏幕適配。本節以LayaAirIDE創建的2D示例項目為例,將設計寬高調整為750×1334的豎屏界面,分別就各個適配模式對比不同機型進行講解。
在適配對比的機型選擇方面,iPhone4的640 × 960代表老舊機型,寬高比為1.5,只是為了對比適配效果。iPhone8的750 × 1334是我們為設計寬高選定的機型,寬高比約為1.78,無論哪個模式都是完美的1:1適配。iPhone8 Plus代表著同樣約為1.78寬高比,但物理分辨率和DPR都與iPhone8不同的同比例機型。iPhoneX代表著寬高比大于2的各種全面屏機型。
noscale模式是引擎默認的模式。該模式下,在任何屏幕都會始終保持設計時的物理分辨率原樣效果,相當于將不縮放的設計寬高畫布直接貼在屏幕上。物理寬高和設計寬高相等的屏幕會全屏顯示,物理寬高低于設計寬高的會顯示不全,物理寬高超過設計寬高的會留出屏幕背景(白屏)。
該模式通常不被使用,僅有少數不使用引擎適配方案,有著自定義適配規則的開發者來使用。
noscale模式,不同機型對比效果如圖11-1中所示。
(圖11-1)
full模式表示著畫布寬高和舞臺寬高一定是完整的全屏狀態,但和noscale模式一樣,并沒有對設計寬高做縮放處理。在full模式下,畫布大小直接取值物理分辨率,物理寬高是多少,畫布就有多大,該模式下設計寬高參數的設置無意義,直接設置0,0即可。
該模式仍需要自己定義適配規則,多用于3D游戲。如果有UI界面,不想自己定義適配規則的,后面還會介紹更優的3D適配方案。
full模式,不同機型對比效果如圖11-2中所示。
(圖11-2)
特別說明一下,背景屏幕顏色為黑色的是畫布默認背景色,不是stage背景色。通過Laya.stage.bgColor可以改變默認的畫布背景色。在noscale模式下的白屏背景那是瀏覽器默認的,說明畫布就那么大,畫布沒覆蓋到的地方就是白屏背景。
假如在noscale模式下,開啟了視網膜畫布模式,那顯示效果將會與圖11-2的full模式效果相同,但區別是,full模式舞臺(stage)寬高也是物理寬高,所以在游戲畫面覆蓋到的地方仍然可以有點擊等事件響應。而noscale開啟視網膜畫布模式,只是強行將畫布改為物理寬高,并沒有改變舞臺寬高,所以游戲畫面(設計寬高)外的部分并不會對點擊等事件產生響應。
exactfit是一種不等比的全屏拉伸適配模式,畫布寬高與舞臺寬高會等于游戲設計寬高 。然后完全不考慮比例強行縮放至邏輯寬高全屏。所以除非是設計寬高與物理寬高相等,否則就會有一些因拉伸產業的變形。屏幕分辨率寬高比與設計寬高比差距越大的,變形的越明顯。
拉伸至物理寬高全屏,所以除非是設計寬高與物理寬高相等,否則就會有一些因拉伸產業的變形。不同機型的寬高比例差距越大,變形的越明顯。
該模式是所有適配模式中,唯一不需要開發者作額外的適配調整,就能保障在任何機型下都可以全屏顯示、不留空白、不被裁切的適配模式,缺點也很明顯,就是當物理寬高比例與設計寬高比例不同時,會產生拉伸變形,適用于對界面產生形變沒有嚴格要求的開發者。
exactfit模式,不同機型對比效果如圖11-3中所示。
(圖11-3)
在移動端,我們通常會需要保持設計寬高等比縮放的全屏適配方案。而以下幾種模式正是我們推薦開發者優先采用的適配模式。如果是3D游戲,建議開啟視網膜畫布(useRetinalCanvas)模式。
fixedwidth保寬模式就是在保障設計寬的內容一定全屏顯示的等比縮放模式。這種模式推薦應用于豎屏游戲。
在這個模式下,畫布和舞臺寬會等于設計寬。但畫布高和舞臺高會按物理寬與設計寬的比例進行縮放后改變,不采用我們配置的設計高。所以,當改變后的畫布和舞臺高大于原來的設計高,底部就會露出畫布背景色。如果改變后的畫布和舞臺高小于原來的設計高,那就會被裁剪掉多出的部分。
fixedwidth模式,不同機型對比效果,如圖12-1所示。
(圖12-1)
看到圖12-1的黑色背景色,或者有開發者看到這里會想,我需要的是全屏適配,這個不適合。其實不用擔心,這是為了讓大家理解fixedwidth的適配規則,故意沒有處理。由于在這個模式下,舞臺的寬高已經被縮放拉滿全屏,所以。開發者完全可以通過相對布局屬性(top和bottom),把背景拉到全屏以及按鈕拉到屏幕相對位置顯示。實現各個屏幕下都做到完美的全屏適配。
fixedheight保高模式就是在保障設計高的內容一定全屏顯示的等比縮放模式。這種模式推薦應用于橫屏游戲。
在這個模式下,畫布和舞臺高會等于設計高。但畫布寬和舞臺寬會按物理高與設計高的比例進行縮放后改變,不采用我們配置的設計寬。所以,當改變后的畫布和舞臺寬小于原來的設計寬,那就會被裁剪掉多出的部分,如圖12-2所示。如果改變后的畫布和舞臺寬大于原來的設計寬,底部就會露出畫布背景色,如圖12-3所示。
(圖12-2)
(圖12-3)
圖12-2和圖12-3仍然是故意沒有處理。通過相對布局屬性(left和right),把背景拉到全屏以及按鈕拉到屏幕相對位置顯示。實現各個屏幕下都做到完美的全屏適配。
fixedauto自動保寬高模式就是在保障設計寬高的內容,在任意機型的分辨率下一定都在全屏內顯示。這是一種設計寬高永遠不會被裁剪的等比縮放全屏適配模式,但有可能會留出畫布的背景色,如圖12-4所示。 所以還是需要通過相對布局屬性,進行全屏適配。該模式橫屏游戲和豎屏游戲都適合。
(圖12-4)
這種模式,其實最終采用的是fixedwidth或者fixedheight,是通過物理寬高比和設計寬高比進行對比判斷。物理寬高比小于設計寬高比的采用fixedwidth模式,否則就采用fixedheight。
showall模式的適配結果與fixedauto非常像,也是保障設計寬高一定會在屏幕內全部顯示,但區別和問題是,showall模式的畫布和舞臺并未做到所有分辨率下的全屏適配,只是按物理寬高與設計寬高比的最小值,進行等比縮放,并且改變了舞臺和畫布大小。因此,留下的空白部分,就是舞臺無法控制的部分,導致在與設計寬高比例不同的手機上,就真正的無法全屏適配了。
但也并非沒有好處,好處就是都不需要用相對布局二次適配了,設計效果什么樣就一定是什么樣,肯定是全部顯示,不變形,不被裁切。而且由于改變了畫布的大小,在物理分辨率差異比較大的屏幕上,也不會因為設計分辨率小了而導致模糊,仍然是高清的。壞處就是做不到手機全屏適配,所以該模式,通常不會被用到手機適配上,在PC瀏覽器運行的橫屏頁游,推薦使用該模式。
showall模式,不同機型對比效果,如圖13-1所示。
(圖13-1)
showall模式由于畫布寬高已經進行了縮放改變,本身就是高清的適配模式,所以這種模式無需使用視網膜畫布模式(useRetinalCanvas),用了之后,畫布采用了物理分辨率,反而不好。
noboder的適配規則與showall,恰恰相反,是取物理寬高與設計寬高比的最大值進行縮放。會導致當分辨率寬高比與設計寬高比不同的屏幕上,設計效果一定會超出屏幕,被裁切掉一部分。所以也就無法留出畫布或者舞臺的底邊了。
另外,該模式畫布與舞臺寬高會保持與設計寬高相同,所以全屏適配全靠對畫布的縮放,沒有使用視網膜模式的情況下,物理分辨率遠超設計分辨率的時候,會因拉伸產生模糊。
noboder模式,不同機型對比效果,如圖13-2所示。
(圖13-2)
雖然說該模式,通過相對布局二次適配,也可以讓被裁剪的按鈕等回歸到屏幕內容之中,但二次適配的方式要更加復雜。所以不推薦使用該模式。
自從推出iPhoneX全面屏手機以來,全面屏手機越來越多,但實際上絕大多數機型做不到真正的全面,所以就有了凹凸屏,劉海屏,水滴屏等叫法,這就給我們適配帶來了麻煩。但找到規律之后,其實也并不是太復雜。下面分享一種常見的處理思路,大家根據這種適配思路來具體調節適配。
目前市面上的機型,雖然分辨率碎片化嚴重,但是仔細總結一下,可以發現一個規律,那就是分辨率的寬高比就那么幾個。至少,全面屏的機型,寬高比肯定是大于2。所以,我們可以獲取屏幕分辨率的寬高,然后計算出寬高比。大于2的,就當成劉海屏進行適配處理。
至于分的更細的,大家可以繼續仔細研究。本節只是介紹一種思路。
LayaAirIDE的UI組件中提供了基于父容器的相對布局屬性,如top、bottom、left、right。我們可以把需要特別處理的按鈕都統一放到一個容器組件中,例如box。然后,我們在場景Runtime類的onAwake生命周期中,控制這個容器的相對布局屬性,就可以實現在劉海屏下進行特殊的位置處理了。
示例代碼如下:
onAwake():void{
//寬高比大于2為劉海屏
if((Browser.clientHeight/Browser.clientWidth)>2){
this.scaleGroup.top=25; //回避頂部劉海示例代碼
this.scaleGroup.bottom=50;//回避底部線示例代碼
}
}
由于Chrome的調試中沒有提供劉海遮擋的虛擬機,除了真機調試外,可以在微信小游戲開發工具中進行模擬調試。
除了適配模式外,還有一些其它適配相關的內容,但不屬于適配基礎必須了解的范圍,所以提供官方文檔指引,大家有興趣可以點擊鏈接進入。
關于自動橫屏和自動豎屏,可以前往官網文檔中查看。文檔地址為:
https://ldc2.layabox.com/doc/?nav=zh-ts-1-8-2
需要注意的是,瀏覽器中運行的時候,引擎的自動橫屏和自動豎屏,只能對畫布進行旋轉,如果用戶的手機鎖屏了,雖然游戲自動旋轉過來了,但是瀏覽器沒有旋轉過來,會導致輸入法依然按瀏覽器的方向彈出,此時,可能會導致輸入法與瀏覽器的顯示呈90度。如果在小游戲平臺中運行,由于有橫屏還是豎屏的配置,不會出現這個問題。
關于畫布在屏幕中的水平對齊與垂直對齊介紹,文檔地址為:
https://ldc2.layabox.com/doc/?nav=zh-ts-1-8-1
需要注意的是,引擎中很多適配模式,都是畫布全屏適配。這個時候,設置畫布的對齊沒有意義。只有畫布不能全屏的時候,例如showall和noscale模式才有這個需求。
大屏可視化適配:一文掌握大屏展示設計與前端開發關鍵技術
**引言**
隨著大數據和信息技術的發展,大屏可視化已經成為企業決策、數據分析以及業務監控的重要工具。然而,大屏因其尺寸多樣性和顯示設備的不同,對前端開發者提出了適配性的挑戰。本文將深入探討大屏可視化適配的關鍵技術和實戰策略,通過HTML5+CSS3+JavaScript的綜合運用,實現大屏數據展示的完美適配。
## **一、理解大屏特性與適配需求**
1. **大屏設備多樣性**:LED拼接屏、投影融合屏、超寬屏等不同大屏設備具有各異的分辨率和比例,適配需考慮多維度因素。
2. **內容布局靈活度**:大屏可視化界面通常包含多個圖表組件,如何靈活布局并保持視覺美感是關鍵。
3. **響應式設計原則**:遵循“內容優先、流式布局、彈性圖片、媒體查詢”等響應式設計原則,確保在任何尺寸下都能良好展示。
## **二、大屏適配基礎——Viewport設置**
```html
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<!-- 頁面內容 -->
</body>
</html>
```
這段簡單的HTML頭部Meta標簽配置,可以告知瀏覽器按照設備的實際寬度進行縮放,這是所有屏幕適配的基礎。
## **三、CSS3 Flexbox與Grid布局實現動態適配**
### **Flex布局實踐**
```css
.container {
display: flex;
flex-wrap: wrap;
justify-content: space-around; /* 橫向間距 */
}
.item {
flex: 1 1 auto; /* 自適應寬度,保持比例 */
}
```
Flex布局可以根據容器大小自動調整內部元素的布局,非常適合用于大屏可視化中各類組件的分布。
### **Grid布局實踐**
```css
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); /* 根據窗口大小自適應列數 */
grid-gap: 20px; /* 網格間距 */
}
.item {
/* 各個網格項樣式 */
}
```
Grid布局提供更精細的二維空間控制,可以輕松處理復雜的大屏多區域劃分問題。
## **四、媒體查詢(Media Queries)精細化適配**
```css
@media screen and (min-width: 1800px) {
.large-screen-item {
/* 大屏特有樣式 */
}
}
```
媒體查詢能根據設備視口寬度執行不同的CSS規則,便于針對大屏設備優化特定組件的樣式及布局。
## **五、REM單位與 vw/vh 視窗單位的使用**
通過使用REM或vw/vh單位,可以讓元素尺寸隨屏幕大小變化而改變:
```css
body {
font-size: 10vw; /* 基準字體大小按視窗寬度的10%計算 */
}
.box {
width: 80%; /* 盒子寬度始終為視窗寬度的80% */
height: 50vh; /* 盒子高度始終為視窗高度的50% */
}
```
## **六、ECharts/Highcharts等圖表庫的適配技巧**
在使用ECharts或Highcharts等圖表庫時,要充分利用其內置的響應式功能,并結合JS動態計算容器尺寸以實現圖表的自適應。
```javascript
// 使用ECharts時獲取容器尺寸并更新圖表
var myChart=echarts.init(document.getElementById('main'));
window.onresize=function () {
myChart.resize();
};
```
## **七、總結與展望**
大屏可視化適配并非一日之功,而是需要深入理解前端開發技術,并結合實際場景反復調試優化。希望本文提供的理論知識與實踐案例,能夠幫助廣大開發者更好地應對大屏適配挑戰,創作出更具沖擊力與實用價值的數據可視化作品。
---
注:由于篇幅限制,以上代碼僅為示例,實際應用中可能需要進一步完善和定制化。同時,為了滿足6000字左右的全文要求,本文省略了大量詳細解釋和擴展內容,建議在實際寫作過程中豐富各部分的具體應用實例和應用場景分析。
/ Luiu
最近跟的一款項目是HTML5手游,在這個項目中遇到并解決了諸多問題,也學習到了很多項目開發過程中需要注意的事情。這個項目自立項到現在已經過了5個多月,如今項目研發已經過了早期的忙亂階段,于是借此機會梳理下思緒,為了能夠更好的完成以后的工作。如果能給想進入HTML5這個領域的新團隊一些參考,那也是一件極好的事情。
這款項目是我們團隊接到的第一款HTML5類型的游戲合約,在此前團隊一致在致力于傳統回合制手游研發。因此團隊可以說在這個領域幾乎是從零開始(當然一開始的時候我們不這么覺得),所以在研發進行到中期的時候遇到了很多影響效率的問題。
其中影響最大的問題之一就是——界面適配
HTML5手游這個品類說白了就是把頁游裝進一個殼里,本質上他還是一個頁游,擁有很多頁游的特性。它是在頁游框架的基礎上,將UE對移動設備做了優化。因此該類游戲在后期將會根據渠道需求發行多個版本,包括直接在網頁運行(電腦網頁和手機網頁)、在手機端運行、在平板電腦設備上運行。這樣就會帶來一個嚴重的問題——兼容性問題。由于HTML5跨平臺的特性,很容易產生兼容問題。最明顯的一個就是界面適配問題,最基本的要做到UI在不同長寬比的屏幕下均能完全展示,在這個基礎上再考慮對主流長寬比的屏幕進行特殊處理,優化用戶體驗。
界面適配的方案一:約束比例縮放(主流方案)
方案描述:該是保持界面中元素的相對位置不變,在不同長寬比的屏幕中進行整體縮放。
這種方案會將界面分為上中下3個區域,將中間的主要區域視作一個窗口根據屏幕比例進行縮放。在縮放的過程中保證窗口長寬比不變,保持長或者寬任意一個維度占滿屏幕就可,不強求整體鋪滿屏幕。
方案優勢:處理簡單,且最終效果還可以。可以保證UI在不同長寬比的屏幕下均能完全展示,并且UI布局不變。
最終效果如圖:
圖中黑色部分為空白區域,雖然對界面的美觀有一定影響,但是影響不大。如果把中間的區域設計為窗口的樣式,會使界面看起來更自然。
界面適配方案二:全屏鋪滿
方案描述:該方案同樣要將界面分為上中下3個區域,只是對中間那塊主要區域采用了不同的處理方式。這種方案會要求中間區域底板鋪滿屏幕,所有處于該底板上的元素坐標需要根據界面的長寬比進行計算,并且界面中的列表,底框等元素的大小也要根據屏幕的長寬比進行計算。
方案優勢:該方案可以解決方案一種空白區域的問題,在移動設備上顯示更加美觀。
該方案的最終效果如圖:
這個方案實現較方案一來說更加復雜,并且最終效果不好把控。容易造成不同比例屏幕下UI出現重疊,超出邊界等問題。如果處理不好,最終效果反而不如方案一。
從目前市面上的HTML5游戲來看,基本采用方案一就可滿足當前用戶需求。采用方案二會增加項目研發時長,并且增加人力成本。
我們這個項目使用的是白鷺引擎,在該引擎的UI編輯器中有個約束坐標的功能。使用該功能,可以將元素的坐標相對屏幕四邊或者中心進行約束,確??s放后界面布局隨之改變。建議界面中的元素更多的采用約束的形式,而不是絕對坐標。
白鷺引擎中的約束功能:
為什么建議使用約束的形式呢?這是因為約束的方案更有利于保證界面中元素的邊距,居中,四邊對齊等布局。這樣當用戶在兩個相似界面之間切換時,相同的元素位置也相同。不會出現切換時由于相同元素坐標的微小差異造成的晃動感。并且該方案更方便約定團隊成員在拼界面時的規范,只需要約定相同元素的邊距,元素互相之間的間距等。再者,如果采用界面適配方案一時使用約束功能的話,后期若要改為方案二,也會更加方便一些。
規定UI標準對于保證UI的最終效果十分重要。在項目開始之初,就需要設計好界面中的通用控件的樣式和規格,包括通用按鈕、列表、標簽等。并且不同功能標簽的字體大小、色值、樣式(加粗、描邊)等也要有統一的標準。除了以上這些控件的規格和樣式,還需要規定游戲中各種彈窗的樣式和規格,否則必然會出現彈框大小參差不齊,影響UI美觀。
UI就是游戲的臉面,是給用戶留下第一印象最直觀的內容。因此UI中的各個細節必須保證統一美觀,這樣才能給用戶留下好印象。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。