LayaAir 螢幕適配-縮放模式
目錄
LayaAir 寬高定義
1、設計寬高:專案程式碼中初始化舞臺 Laya.init() 中定義的寬高即為設計寬高
2、Stage 寬高:stage 寬高為遊戲舞臺實際大小的寬高
3、適配寬高:通過引擎的適配模式對設計寬高進行縮放改變後的寬高,為了便於區分理解,稱為適配寬高
4、畫布寬高:畫布寬高是指 HTML5 中 canvas 節點的寬高,遊戲中所有可見的內容都在畫布區域內
5、螢幕寬高:螢幕寬高是指手機瀏覽器螢幕的寬高,例如iphone6豎屏時的螢幕寬高為375*667
。LayaAir引擎可以通過laya.utils.Browser.clientWidth 和 laya.utils.Browser.clientHeight 來獲取螢幕的寬與高。
6、物理寬高:手機螢幕視窗的實際寬高,LayaAir引擎可以通過laya.utils.Browser.width和laya.utils.Browser.height來獲取裝置螢幕螢幕的物理寬高。詳情可參考《LayaAir 螢幕適配-解析度、對齊模式》
螢幕縮放模式
1、螢幕縮放指視窗大小變化時,內容應該如何變化,這是螢幕適配經常遇到的問題,視窗大小變化也就意味著解析度變化。
2、laya.display.Stage,提供了 scaleMode (縮放模式)函式,共有引數值:
/**縮放模式。預設值為 "noscale"。</p>
* <p><ul>取值範圍:
* <li>"noscale" :不縮放;</li>
* <li>"exactfit" :全屏不等比縮放;</li>
* <li>"showall" :最小比例縮放;</li>
* <li>"noborder" :最大比例縮放;</li>
* <li>"full" :不縮放,stage的寬高等於螢幕寬高;</li>
* <li>"fixedwidth" :寬度不變,高度根據螢幕比縮放;</li>
* <li>"fixedheight" :高度不變,寬度根據螢幕比縮放;</li>
* <li>"fixedauto" :根據寬高比,自動選擇使用fixedwidth或fixedheight;</li>
* </ul></p>
*/
scaleMode: string;
3、同樣為了方便呼叫,Laya.Stage 提供了它們對應的常量:
SCALE_NOSCALE : String = noscale ,[static] 應用保持設計寬高不變,不縮放不變型,stage的寬高等於設計寬高。 |
SCALE_EXACTFIT : String = exactfit ,[static] 應用根據螢幕大小鋪滿全屏,非等比縮放會變型,stage的寬高等於設計寬高。 |
SCALE_SHOWALL : String = showall [static] 應用顯示全部內容,按照最小比率縮放,等比縮放不變型,一邊可能會留空白,stage的寬高等於設計寬高。 |
SCALE_NOBORDER : String = noborder [static] 應用按照最大比率縮放顯示,寬或高方向會顯示一部分,等比縮放不變型,stage的寬高等於設計寬高。 |
SCALE_FULL : String = full ,[static] 應用保持設計寬高不變,不縮放不變型,stage的寬高等於螢幕寬高。 |
SCALE_FIXED_HEIGHT : String = fixedheight [static] 應用保持設計高度不變,寬度根據螢幕比縮放,stage的高度等於設計寬度,寬度根據螢幕比率大小而變化 |
SCALE_FIXED_WIDTH : String = fixedwidth [static] 應用保持設計寬度不變,高度根據螢幕比縮放,stage的寬度等於設計高度,高度根據螢幕比率大小而變化 |
SCALE_FIXED_AUTO : String = fixedauto [static] 應用保持設計比例不變,全屏顯示全部內容(類似showall,但showall非全屏,會有黑邊),根據螢幕長寬比,自動選擇使用SCALE_FIXED_WIDTH或SCALE_FIXED_HEIGHT |
//初始化引擎,不支援WebGL時會自動切換至Canvas
Laya.init(500, 350,Laya.WebGL);
//在舞臺上繪製一張底圖作為背景,圖片解析度:686 * 325
var bgImageSprite = new Laya.Sprite();
bgImageSprite.loadImage("https://www.jetbrains.com/idea/img/screenshots/idea_overview_3.png");
Laya.stage.addChild(bgImageSprite);
//在舞臺繪製一個矩形
var showInfoSprite = new Laya.Sprite();
showInfoSprite.pos(10,10);//精靈在舞臺位置為 x=10,y=10
//矩形起點(0,0),矩形長100,寬50
showInfoSprite.graphics.drawRect(0,0,100,50,"#CC6633");
//在矩形的中間繪製一行文字
showInfoSprite.graphics.fillText("縮放模式",50,10,"20px Arial","#fff","center");
Laya.stage.addChild(showInfoSprite);
//陣列儲存縮放模式
var scaleModes = [];
scaleModes.push(Laya.Stage.SCALE_NOSCALE);
scaleModes.push(Laya.Stage.SCALE_EXACTFIT);
scaleModes.push(Laya.Stage.SCALE_SHOWALL);
scaleModes.push(Laya.Stage.SCALE_NOBORDER);
scaleModes.push(Laya.Stage.SCALE_FULL);
scaleModes.push("fixedwidth");
scaleModes.push("fixedheight");
scaleModes.push("fixedauto");
//為整個舞臺繫結單擊事件;count 用於計數
var count = 0;
Laya.stage.on(Laya.Event.CLICK,this,stageClick);
function stageClick (){
console.log("切換縮放模式為:"+scaleModes[count]);
//改變矩形顯示的文字內容
showInfoSprite.graphics.clear();
showInfoSprite.graphics.drawRect(0,0,100,50,"#CC6633");
showInfoSprite.graphics.fillText(scaleModes[count],50,10,"20px Arial","#fff","center");
//改變縮放模式
Laya.stage.scaleMode = scaleModes[count++];
count = count>7?0:count;
}
事例中:設計寬高:500, 350,圖片寬高:686 * 325
1、full 模式完全按物理畫素渲染,螢幕有多大,適配的畫面就有多大,是高畫質常用的適配模式,但是在不同尺寸的螢幕裡,顯示內容的大小會有所不同,同時對於HTML5遊戲的效能壓力要高於其它適配模式。
2、showall 和 noborder 是等比縮放模式,會保持畫面不變形。showall按照螢幕與設計寬高最小比率縮放,保證畫面能完全顯示出來,但會導致有空屏黑邊。noborder剛好相反,按照螢幕與設計寬高最大比率縮放,不會出現空屏黑邊,但會導致寬或高的部分內容無法顯示出來。
3、 fixedwidth 與 fixedheight 更像 showall和noborder 的變種,同樣也是等比縮放模式,但是指定了一邊不動,另外一邊進行縮放,是當前HTML5遊戲中比較常用的主流適配模式
更多資訊可以參考官網:https://ldc.layabox.com/doc/?nav=zh-js-1-8-3