2011-09-04 17 views
5

Tôi đang cố gắng định lại kích thước/chia tỷ lệ hình ảnh bằng cách sử dụng phương pháp kéo tích hợp của Raphael.js, nhưng tôi nhận được một số hành vi kỳ lạ.Kéo Raphael.js với quy mô gây ra hành vi nhảy lạ

Đây là jsfiddle: http://jsfiddle.net/charleshimmer/5pdyy/1/

Sử dụng quyền hoặc góc dưới bên phải để thay đổi kích thước hình ảnh. Bạn sẽ thấy một số hành vi kỳ lạ với nó nhảy và bỏ qua bằng cách sử dụng phương pháp quy mô. Bất cứ ai có bất kỳ ý tưởng tại sao?

Tôi có thể làm cho nó đổi kích thước làm mịn bằng cách cập nhật chiều rộng và chiều cao của hình ảnh, nhưng sau đó tỷ lệ cỡ ảnh bị tắt. Sử dụng image.scale, tỷ lệ co được duy trì, nhưng sau đó nó nhảy khắp nơi.

+2

Vì vậy, tôi đã nhận nó làm việc. Tôi chỉ cần tính toán tỷ lệ của hình ảnh bằng cách sử dụng chiều cao/chiều rộng và không tắt sự thay đổi về pixel. Tôi vẫn cần phải điều chỉnh cách thay đổi kích thước hình ảnh tùy thuộc vào phía nào của hình ảnh mà người dùng thay đổi kích thước hình ảnh, nhưng tôi đã cập nhật liên kết jsfiddle để phản ánh mã hoạt động trong trường hợp ai đó cần nó. – chuckles

+10

Bạn nên trả lời câu hỏi của riêng mình thay vì để lại nhận xét nếu bạn đã giải quyết được vấn đề của mình. Bằng cách đó nó sẽ hữu ích hơn cho những người khác – musefan

+2

Câu hỏi của bạn hiện đang ở đầu danh sách chưa được trả lời cho các thẻ "svg" và "raphael". Hãy trả lời câu hỏi của bạn và chấp nhận nó, cảm ơn. –

Trả lời

0

HTML

<html> 
<head> 
    <title>Photo Test</title> 
</head> 
<body> 
    <div id="editor"></div> 
    <img id="image" 
     src="http://www.pyrblu.com/assets/launchpad_resources/demo.jpg" 
     style="display:none" 
    > 
</body> 
</html> 

CSS

svg 
    { 
    border: 1px solid red; 
    background:#fff; 
    border-radius: 45px; 
    } 

Javascript

var Editor = {}, 
ctFactor = 7; 

// create Raphael canvas 
Editor.paper = Raphael('editor', 582, 514.8); 

// wait for image to load 
$("#image").load(function(){ 

    Editor.image = Editor.paper.image("http://www.pyrblu.com/assets/launchpad_resources/demo.jpg", 25, 25, 282, 465.2); 

    Editor.image.drag(Editor.dragging, Editor.dragStart, Editor.dragEnd); 
    Editor.image.ready = true; 
    Editor.image.mousemove(function (e) { 
     // only do this if the user isn't currently moving/resizing image 
     if(! this.ready){ 
      return; 
     } 
     var side = Editor.sideDection(e, this); 
     // if the user's mouse is along the edge we want resize 
     if(side){ 
      Editor.image.state = 'resizable'; 
     } 
     // else it's towards the middle and we want to move 
     else{ 
      Editor.image.state = 'movable'; 
     } 
     var cursor = (side) ? side + '-resize' : 'move'; 
     this.attr('cursor', cursor); 
    }); 

}); 

Editor.sideDection = function(event, ct){ 
    // check north side 
    var directions = { 
     n: Math.abs(event.offsetY - ct.attr('y')) <= ctFactor, 
     s: Math.abs(event.offsetY - (ct.attr('height') + ct.attr('y'))) <= ctFactor, 
     e: Math.abs(event.offsetX - (ct.attr('width') + ct.attr('x'))) <= ctFactor, 
     w: Math.abs(event.offsetX - ct.attr('x')) <= ctFactor 
    }, 
    side = ''; 

    // loop through all 4 sides and concate the ones that are true 
    for(var key in directions) { 
     if(directions.hasOwnProperty(key)){ 
      if(directions[key]){ 
       side = side + key; 
      }  
     } 
    } 

    return side; 
}; 

Editor.dragStart = function() { 
    console.log('at start'); 
    // grab original x, y coords   
    this.ox = this.attr("x"); 
    this.oy = this.attr("y"); 

    // toggle user is doing something 
    // so other actions are blocked 
    this.ready = false; 

    this.animate({opacity: .65}, 500, ">"); 
}; 

Editor.dragging = function (dx, dy, x, y, e) { 
    console.log('at dragging'); 
    if(this.state === 'movable'){ 
     // this does the actual moving of the object 
     this.attr({x: this.ox + dx, y: this.oy + dy});  
    } 
    // we are resizing then 
    else{ 

     var diff = (x - this.ox) - this.attr('width'), 
      xratio = 1 + diff/this.attr('width'), 
      yratio = 1 + diff/this.attr('height'); 

     console.log('diff: ', diff, 'xratio: ', xratio, 'yratio: ', yratio);   
     //resize image, update both height and width to keep aspect ratio 
     // this.attr({ 
     //  'width': this.attr('width') * xratio, 
     //  'height': this.attr('height') * yratio 
     // }); 
     this.scale(xratio, xratio, 0, 0); 

     //console.log('h: ', this.attr('height'), 'w: ', this.attr('width'), 'r', this.attr('width')/this.attr('height')); 
    } 
}; 

Editor.dragEnd = function() { 
    this.ready = true; 
    this.animate({opacity: 1}, 500, ">"); 
}; 
Các vấn đề liên quan