KineticJs-如何在调整舞台图层大小后更新多个图像的x和y位置

时间:2013-12-20 11:49:18

标签: resize html5-canvas kineticjs

由于我是KineticJs的新手,所以我尝试使用Kinectic js在不同的x和y上绘制多个图像。现在我想调整舞台图层或画布的大小。我已经通过使用下面给出的代码

完成了这项工作
  window.onresize = function (event) {

                                stage.setWidth(($('#tab' + tabId).innerWidth() / 100) * 80);
                                var _images = layer.getChildren();

                                for (var i = 0; i < _images.length; i++) {
                                    if (typeof _images[i].getId() != 'undefined') {
                                        //alert(stage.getScale().x);
                                        _images[i].setX(_images[i].getX() * stage.getScale().x);
                                        layer.draw();
                                    }
                                }
                            }

但现在问题是正在定义,现在如果浏览器调整大小而不是调整舞台大小但是前缀x和y上的图像是固定的。我想将它们固定在调整舞台图层或画布大小的位置。这是在调整大小之前和调整大小之后图像的链接。beforeresizeafterResize

以下是我的完整代码: -

$("#tabs li").each(function () {
            $(this).live("click", function () {
                clearInterval(_timer);
                var tabname = $(this).find("a").attr('name');
                tabname = $.trim(tabname.replace("#tab", ""));
                var tabId = $(this).find("a").attr('href');
                tabId = $.trim(tabId.replace("#", ""));
                $.ajax({
                    url: "/Home/GetTabsDetail",
                    dataType: 'json',
                    type: 'GET',
                    data: { tabId: tabId },
                    cache: false,
                    success: function (data) {
                        var bayStatus = [];
                        var i = 0;
                        var image_array = [];
                        var BayExist = false;
                        var BayCondition;
                        var imgSrc;
                        var CanvasBacgroundImage;
                        var _X;
                        var _bayNumber;
                        var _Y;
                        var _ZoneName;
                        $(data).each(function (i, val) {
                            i = i + 1;
                            if (!BayExist) {
                                bayStatus = val.BayStatus;
                                CanvasBacgroundImage = val.TabImageLocation;
                                BayExist = true;
                            }
                            $.each(val, function (k, v) {
                                if (k == "BayNumber") {
                                    BayCondition = bayStatus[v];
                                    _bayNumber = v;
                                    if (BayCondition == "O")
                                        imgSrc = "../../images/Parking/OccupiedCar.gif"
                                    else if (BayCondition == "N")
                                        imgSrc = "../../images/Parking/OpenCar.gif";
                                }
                                if (k == "BayX")
                                    _X = v;
                                if (k == "BayY")
                                    _Y = v;
                                if (k == "ZoneName")
                                    _ZoneName = v;
                            });
                            image_array.push({ img: imgSrc, xAxis: _X, yAxis: _Y, toolTip: _bayNumber, ZoneName: _ZoneName });
                        });
                        var imageUrl = CanvasBacgroundImage;
                        if ($('#tab' + tabId).length) {
                            // $('#tab' + tabId).css('background-image', 'url("../../images/Parking/' + imageUrl + '")');
                            var stage = new Kinetic.Stage({
                                container: 'tab' + tabId,
                                width: ($('#tab' + tabId).innerWidth() / 100) * 80,  // 80% width of the window.
                                height: 308
                            });

                            window.onresize = function (event) {

                                stage.setWidth(($('#tab' + tabId).innerWidth() / 100) * 80);
                            }
                            $('#tab' + tabId).find('.kineticjs-content').css({ 'background-image': 'url("../../images/Parking/' + imageUrl + '")', 'background-repeat': ' no-repeat', 'background-size': '100% 100%' });
                            var layer = new Kinetic.Layer();
                            var planetOverlay;
                            function writeMessage(message, _x, _y) {
                                text.setX(_x + 20);
                                text.setY(_y + 1);
                                text.setText(message);
                                layer.draw();
                            }
                            var text = new Kinetic.Text({
                                fontFamily: 'Arial',
                                fontSize: 14,
                                text: '',
                                fill: '#000',
                                width: 200,
                                height: 60,
                                align: 'center'
                            });
                            var opentooltip = new Opentip(
                                "div#tab" + tabId, //target element 
                                "dummy", // will be replaced
                                "", // title
                                {
                                showOn: null // I'll manually manage the showOn effect
                            });
                            Opentip.styles.win = {
                                borderColor: "black",
                                shadow: false,
                                background: "#EAEAEA"
                            };
                            Opentip.defaultStyle = "win";
                            // _timer = setInterval(function () {
                            for (i = 0; i < image_array.length; i++) {
                                img = new Image();

                                img.src = image_array[i].img;
                                planetOverlay = new Kinetic.Image({
                                    x: image_array[i].xAxis,
                                    y: image_array[i].yAxis,
                                    image: img,
                                    height: 18,
                                    width: 18,
                                    id: image_array[i].toolTip,
                                    name: image_array[i].ZoneName
                                });

                                planetOverlay.on('mouseover', function () {
                                    opentooltip.setContent("<span style='color:#87898C;'><b>Bay:</b></span> <span style='color:#25A0D3;'>" + this.getId() + "</span><br> <span style='color:#87898C;'><b>Zone:</b></span><span  style='color:#25A0D3;'>" + this.getName() + "</span>");
                                    //writeMessage("Bay: " + this.getId() + " , Zone: " + this.getName(), this.getX(), this.getY());//other way of showing tooltip
                                    opentooltip.show();
                                    $("#opentip-1").offset({ left: this.getX(), top: this.getY() });
                                });
                                planetOverlay.on('mouseout', function () {
                                    opentooltip.hide();
                                    // writeMessage('');
                                });
                                planetOverlay.createImageHitRegion(function () {
                                    layer.draw();
                                });
                                layer.add(planetOverlay);
                                layer.add(text);
                                stage.add(layer);
                            }
                            //  clearInterval(_timer);
                            //$("#tab3 .kineticjs-content").find("canvas").css('background-image', 'url("' + imageUrl + '")');

                            //  },
                            //  500)

                        }
                    }
                    ,
                    error: function (result) {
                        alert('error');
                    }
                });
            });
        });

我希望在调整大小之前将图标保持在原来的位置。我已经尝试过但无法得到正确的解决方案来完成这项工作。

如何更新图像的x,y位置?任何建议将不胜感激。

谢谢你的到来。

2 个答案:

答案 0 :(得分:1)

在window.resize中,您将通过缩放系数更改舞台宽度。

保存该比例因子。

然后将图像的“x”坐标乘以该缩放系数。

您可以像这样重置图像的“x”位置:

yourImage.setX( yourImage.getX() * scalingFactor );

layer.draw();

答案 1 :(得分:0)

在上面提到的window.onresize代码中。代码已经修改,如下: -

 window.onresize = function (event) {

                                _orignalWidth = stage.getWidth();
                                var _orignalHeight = stage.getHeight();
                                // alert(_orignalWidth);
                                // alert($('#tab' + tabId).outerHeight());
                                stage.setWidth(($('#tab' + tabId).innerWidth() / 100) * 80);
                                //stage.setHeight(($('#tab' + tabId).outerHeight() / 100) * 80);
                                _resizedWidth = stage.getWidth();
                                _resizedHeight = stage.getHeight();
                                // alert(_resizedWidth);
                                _scaleFactorX = _resizedWidth / _orignalWidth;
                                var _scaleFactorY = _resizedHeight / _orignalHeight;
                                //alert(_scaleFactor);
                                var _images = layer.getChildren();

                                for (var i = 0; i < _images.length; i++) {
                                    if (typeof _images[i].getId() != 'undefined') {
                                        //alert(stage.getScale().x);
                                        _images[i].setX(_images[i].getX() * _scaleFactorX);
                                        //_images[i].setY(_images[i].getY() * _scaleFactorY);
                                        layer.draw();
                                    }
                                }
                            }