createjs强制横屏方法
大家做一些专题页和游戏的时候一定遇到过页面必须横屏的情况,那有没有办法强制控制横屏呢?先看看下面代码
<!-- uc强制竖屏 --> <meta name="screen-orientation" content="portrait"> <!-- QQ强制竖屏 --> <meta name="x5-orientation" content="portrait"> <!-- UC强制全屏 --> <meta name="full-screen" content="yes"> <!-- QQ强制全屏 --> <meta name="x5-fullscreen" content="true">
这是我网上搜的(没找到强制横屏先用强制竖屏做实验),可惜这些代码只有在UC和QQ浏览器中有用,大家做专题和游戏时,大部分都会针对微信去做,也就是这个方法行不通。
大家还记不记得createjs的显示对象本身是可以转方向的呢?那也就是说把createjs的根容器旋转一下,就可以实现强制横屏了。
那我们试试,大家来看下面这段代码:
//在pc测试的时候,由于浏览器切换为手机模式或者重手机模式切换回来时,浏览器大小并不会改变,所以切换设备模式的时候需要刷新一下页面 function stageBreakHandler(event) { if(stageWidth!=document.documentElement.clientWidth||stageHeight!= document.documentElement.clientHeight) { stageWidth = document.documentElement.clientWidth; stageHeight = document.documentElement.clientHeight; // 新的自适应方式 canvas.width = stageWidth ; canvas.height = stageHeight; if(stageWidth < stageHeight) { stageScale = stageWidth/750; container.rotation = 90; container.x = 750*stageScale; container.y =stageHeight/2-1334*stageScale/2;//居中一下 container.scaleX = stageScale; container.scaleY = stageScale; } else { stageScale = stageWidth/1334; container.rotation = 0; container.x = 0; container.scaleX = stageScale; container.scaleY = stageScale; } // 旧的自适应方式 // if(stageWidth < stageHeight) // { // canvas.width = 750; // canvas.height = 1334; // stageScale = stageWidth/750; // container.rotation = 90; // container.x = 750; // canvas.style.top =stageHeight/2-1334*stageScale/2 + 'px';//居中一下 // canvas.style.width = 750*stageScale + 'px'; // canvas.style.height = 1334*stageScale + 'px'; // } // else // { // canvas.width = 1334; // canvas.height = 750; // stageScale = stageWidth/1334; // container.rotation = 0; // container.x = 0; // canvas.style.width = 1334*stageScale + 'px'; // canvas.style.height = 750*stageScale + 'px'; // } } stage.update(); }
我来解释这段代码(不知道新旧自适应方式的点这里:传送门 这里新旧都是可以用的),首先判断舞台的宽高,为什么要判断舞台的宽高呢?因为要判断横竖屏。那么很多人会问,“为什么不用js接口去判断横竖屏呢?”,因为我们判断横竖屏的最终原因不是真的判断手机的横竖屏,而是判断width是不是大于height,有点模糊想不通?简单的讲,因为页面其他元素的原因,导致canvas在竖屏的时候width也大于height你还按照横屏的标准去判断吗?显然不会。判断好了横竖屏,那就来写自适应。本来就是横屏的时候自适应很简单,直接根据宽度来自适应就可以了,重点来讲讲竖屏的时候自适应。竖屏的时候首先把根容器翻倒,所以rotation = 90,但是翻转的时候是根据0,0点翻转的,翻转后会翻到屏幕后面,所以还需要根据自身的宽加坐标,750*stageScale。
旋转后坐标关系
最后根据屏幕大小再自适应一下就可以了,也就是调整container的scalexy相应数值。
不过由于用户锁住竖屏时,实际上屏幕还是竖屏,所以最后强制横屏后分为2种结果:
强制竖屏的结果
非强制竖屏的结果
再讲一些问题:
本人为什么不直接把stage旋转,而是要新建个container旋转?
因为有些游戏并不是所有显示对象都需要旋转的,如果旋转stage,那所有显示对象都会旋转,如果这时候要操作不需要旋转对象的时候,就很麻烦了。
这次的图为什么是切成1334*750 而不是1206*750?
因为由于这次的标题栏可能在最上面,所以图片是可能占满整个屏幕高度的,所以是1334*750。
强制横屏demo:http://www.ajexoop.com/demo/resizeDemo3/index.html
试一下锁屏与不锁屏的不同效果。
戴
我canvas里面有交互,旋转了 交互热区还能继续用么
ajex
@戴 只旋转container可以,不要旋转canvas和stage
匿名
拖拽container里面的元件 移动的x y会互换吗?
ajex
@匿名 会互换 但是因为屏幕也旋转了 所以刚刚好 适配了
匿名
好厉害
匿名
多谢,受用了!!
匿名
强制横屏功能虽然很少用,但是上一次有个项目就需要,当时就没做出来,算是一个bug,学习了。