要做预加载,得显示一个进度条,进度条需要拉伸不变形,于是去搜了一下有没有类似flash影片剪辑里面“九宫格切片”的功能。
确实找到了,地址如下:
https://github.com/CreateJS/EaselJS/tree/6abc90f5c32a29e90666fc2c7dcde5d8b6c8a34f/extras/ScaleBitmap
但是有两个问题
1、只缩放宽/高的时候,显示有BUG
2、从基友那里拿到的图片素材是spriteSheet打包出来的,这个类只支持整张位图的切片,像这样:
所以要修改一下原来的代码
构造函数的地方:
this.snapToPixel = true; //这里加入sourceRect属性 this.sourceRect = new createjs.Rectangle(0,0,this.image.width,this.image.height);
p.draw = function(ctx, ignoreCache) { if (this.DisplayObject_draw(ctx, ignoreCache)) { return true; } var centerX = this.scale9Grid.width; var centerY = this.scale9Grid.height; if(centerX == 0) //vertical { if(centerY == 0) { throw "One of scale9Grid width or height must be greater than zero."; } var imageWidth = this.sourceRect.width; var scale3Region1 = this.sourceRect.y + this.scale9Grid.y; var scale3Region3 = this.sourceRect.y + this.scale9Grid.y + this.scale9Grid.height; var scaledFirstRegion = this.scale9Grid.y; var scaledThirdRegion = this.sourceRect.height - this.scale9Grid.y - this.scale9Grid.height; var scaledSecondRegion = this.drawHeight - scaledFirstRegion - scaledThirdRegion; ctx.drawImage(this.image, this.sourceRect.x, this.sourceRect.y, imageWidth, scaledFirstRegion, 0, 0, this.drawWidth, scaledFirstRegion); ctx.drawImage(this.image, this.sourceRect.x, scale3Region1, imageWidth, centerY, 0, scaledFirstRegion, this.drawWidth, scaledSecondRegion); ctx.drawImage(this.image, this.sourceRect.x, scale3Region3 + centerY, imageWidth, scaledThirdRegion, 0, scaledFirstRegion + scaledSecondRegion, this.drawWidth, scaledThirdRegion); } else if(centerY == 0) //horizontal { var imageHeight = this.sourceRect.height; scale3Region1 = this.sourceRect.x + this.scale9Grid.x; scale3Region3 = this.sourceRect.x + this.scale9Grid.x + this.scale9Grid.width; scaledFirstRegion = this.scale9Grid.x; scaledThirdRegion = this.sourceRect.width - this.scale9Grid.x - this.scale9Grid.width; scaledSecondRegion = this.drawWidth - scaledFirstRegion - scaledThirdRegion; ctx.drawImage(this.image, this.sourceRect.x, this.sourceRect.y, scaledFirstRegion, imageHeight, 0, 0, scaledFirstRegion, this.drawHeight); ctx.drawImage(this.image, scale3Region1, this.sourceRect.y, centerX, imageHeight, scaledFirstRegion, 0, scaledSecondRegion, this.drawHeight); ctx.drawImage(this.image, scale3Region3, this.sourceRect.y, scaledThirdRegion, imageHeight, scaledFirstRegion + scaledSecondRegion, 0, scaledThirdRegion, this.drawHeight); } else { var left = this.scale9Grid.x; var top = this.scale9Grid.y; var right = this.sourceRect.width - centerX - left; var bottom = this.sourceRect.height - centerY - top; var scaledCenterX = this.drawWidth - left - right; var scaledCenterY = this.drawHeight - top - bottom; ctx.drawImage(this.image, this.sourceRect.x, this.sourceRect.y, left, top, 0, 0, left, top); ctx.drawImage(this.image, this.sourceRect.x + left, this.sourceRect.y, centerX, top, left, 0, scaledCenterX, top); ctx.drawImage(this.image, this.sourceRect.x + left + centerX, this.sourceRect.y, right, top, left + scaledCenterX, 0, right, top); ctx.drawImage(this.image, this.sourceRect.x, this.sourceRect.y + top, left, centerY, 0, top, left, scaledCenterY); ctx.drawImage(this.image, this.sourceRect.x + left, this.sourceRect.y + top, centerX, centerY, left, top, scaledCenterX, scaledCenterY); ctx.drawImage(this.image, this.sourceRect.x + left + centerX, this.sourceRect.y + top, right, centerY, left + scaledCenterX, top, right, scaledCenterY); ctx.drawImage(this.image, this.sourceRect.x, this.sourceRect.y + top + centerY, left, bottom, 0, top + scaledCenterY, left, bottom); ctx.drawImage(this.image, this.sourceRect.x + left, this.sourceRect.y + top + centerY, centerX, bottom, left, top + scaledCenterY, scaledCenterX, bottom); ctx.drawImage(this.image, this.sourceRect.x + left + centerX, this.sourceRect.y + top + centerY, right, bottom, left + scaledCenterX, top + scaledCenterY, right, bottom); }
var sb = new createjs.ScaleBitmap(imagePathOrSrc, new createjs.Rectangle(10,10,80,80)); sb.sourceRect = new createjs.Rectangle(x,y,w,h);//这里加入了对sourceRect 的支持 sb.setDrawSize(scaledWidth,scaledHeight); stage.addChild(sb);
完了之后就可以对spriteSheet整合的图片进行九宫格缩放了