html5 canvas 适应屏幕,面向canvas,更加简单的自适应方式

关于自适应我之前已经写了2篇文章了:

不过今天讲的还是自适应,并且今天的自适应会更加的简单好用。

我们先看下下面这个demo:

看到有什么不一样的地方了吗(提示:拉动边框)?经常看我demo的同学知道,之前的自适应拉动边框,canvas内部的像素会产生变化。但是这次的demo虽然canvas也会随着边框的变化而变化,但是内部像素不会变化。这就是之前有同学问的,怎么扩大canvas,而不扩大里面的像素。那这个是怎么做到的呢?其实很简单,之前拉动边框我们会改变canvas STYLE中的width和height,而这次我们是直接改变canvas属性中的width和height,代码如下:

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(leftBtn)

{

leftBtn.x = stageWidth - 100;

}

}

stage.update();

}

我们可以看到里面的像素不会变大,而且红色块一直跟着右边框。

根据这个特性,我们可以制作出新的自适应方法,看demo:

然后是代码:

var scale = 1 / window.devicePixelRatio;

document.querySelector('meta[name="viewport"]').setAttribute('content','width=device-width,initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');

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;

//内部元素自适应

stageScale = stageWidth/750;//宽度自适应;

//    stageScale = stageHeight/1206;//高度自适应两者选一

container.scaleX = stageScale;

container.scaleY = stageScale;

//    container.x = (stageWidth -  750*container.scaleX)/2;//高度自适应时解开这个注释 保证图片居中

if(leftBtn)

{

leftBtn.x = stageWidth - 100;

}

}

stage.update();

}

从demo和代码中看出,我们的自适应分成了外部元素的自适应和内部元素的自适应。这个自适应的原理是直接修改meta标签的viewport来修改全局的缩放大小,以作出移动端2-3倍像素的效果。由于外部的缩放不再影响内部的缩放,我们可以自由的操作createjs的内部元素来达到自适应。这样的自适应感觉和写AS3很像了。注意:上面代码的750和1206是素材的大小不是屏幕的大小,也就是你自适应的素材有多大就写多大

和以前的自适应相比,这个自适应的好处是,制作ui这种不需要随着舞台大小变化的元素时,不需要先扩大后缩小这种麻烦的算法了(因为以前的自适应会修改内部的像素)

以前的自适应代码:

function stageBreakHandler(event)

{

if(stageWidth!=document.documentElement.clientWidth||stageHeight!= document.documentElement.clientHeight)

{

stageWidth =  document.documentElement.clientWidth;

stageHeight = document.documentElement.clientHeight;

stageScale = stageWidth/750;

canvas.style.width = 750*stageScale + 'px';

canvas.style.height = 1206*stageScale + 'px';

}

stage.update();

}

不过由于修改meta标签是全局修改大小的,所以如果和别的前端合作时,要和他说明,让他也使用这种自适应方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值