Pergunta

Estou tendo diferentes SHApes no meu palco e gostaria de torná-los redimensionáveis ​​quando selecionados.

Pensei em "converter" a forma em um grupo e adicionar redimensionadores a ela.Quando o SHApe estiver desmarcado, eu poderia remover os redimensionadores e, em seguida, remover a forma do grupo e adicioná-la de volta ao pai antigo.

Eu tentei isso, e realmente não funciona, pois a origem das coordenadas muda para o Shape e se tiver um dragBoundFunc é pior.Portanto, parece dar muito trabalho e parece errado.Achei que deveria haver uma abordagem melhor para algo assim, que provavelmente é amplamente difundido.

Então, minha pergunta é: qual é a melhor maneira de adicionar redimensionadores a uma forma existente instantaneamente e removê-los quando a forma não estiver mais selecionada?

Foi útil?

Solução

Concordo, o redimensionamento de "âncoras" é visualmente desagradável e complexo para codificar

Adicionar redimensionadores separados a uma imagem é visualmente estranho

(as janelas do sistema operacional não adicionam redimensionadores de aparência desajeitada para permitir o redimensionamento).

Adicionar redimensionadores separados também fica rapidamente complicado.

Metaforicamente, você tem que gerenciar planetas redimensionadores separados orbitando em torno da forma do seu sol.

Gerenciar esses satélites quando a forma é restrita por dragBoundFunc é complicado.

Gerenciar esses satélites quando a forma é girada fica incrivelmente complicado devido ao uso de deslocamentos do KineticJS para definir o ponto de rotação.

Uma alternativa:use a caixa delimitadora da própria forma para gerenciar o redimensionamento.

  • Ouça os eventos do mouse no palco.
  • Quando o usuário passa o mouse sobre uma borda da forma, inicia uma operação de redimensionamento.
  • À medida que o usuário arrasta, redimensione a forma com base na distância que o mouse foi arrastado do lado oposto ao lado arrastado.

Benefícios:

  • Não são necessárias âncoras
  • Usa o mesmo método de redimensionamento com o qual o usuário está familiarizado ao redimensionar janelas de sistema operacional
  • Apenas a forma em si está envolvida, portanto não é necessário um gerenciamento complexo de "âncora de satélite".

Aqui está um exemplo: http://jsfiddle.net/m1erickson/T4E9Y/

Defina uma forma (este exemplo usa uma imagem).

kImage = new Kinetic.Image({
    image:img,
    x:10,
    y:10,
    width:img.width,
    height:img.height,
});
layer.add(kImage);
layer.draw();

Salve a área delimitadora da forma em seu tamanho atual

Ouça os eventos de mousedown no palco.

Salve a posição inicial de arrastar quando o usuário passar o mouse dentro de uma borda de caixa delimitadora de forma

$(stage.getContent()).on('mousedown', function (event) {
    var pos=stage.getPointerPosition();
    var mouseX=parseInt(pos.x);
    var mouseY=parseInt(pos.y);
    var ipos=kImage.position();
    var isize=kImage.getSize();
    var right=ipos.x+isize.width;
    if(mouseX>right-10 && mouseX<right+10){
        startRight=mouseX;
        startWidth=isize.width;
        startHeight=isize.height;
    }
});

Ouça eventos mousemove no palco.

Dimensione a forma com base na distância arrastada a partir da posição inicial de arrastar.

$(stage.getContent()).on('mousemove', function (event) {
    if(startRight>=0){
        var pos=stage.getPointerPosition();
        var mouseX=parseInt(pos.x);
        var mouseY=parseInt(pos.y);
        var dx=mouseX-startRight;
        var scaleFactor=(mouseX-(startRight-startWidth))/startWidth;
        kImage.width(startWidth*scaleFactor);
        kImage.height(startHeight*scaleFactor);
        layer.draw();
    }
});

Ouça os eventos mouseup no palco.

Finalize o redimensionamento de arrastar quando o usuário soltar o mouse

$(stage.getContent()).on('mouseup', function (event) {
    startRight=-1;
});

Para onde ir a partir daqui:

Este exemplo ativa um redimensionador da borda direita.Da mesma forma, você pode ativar as outras bordas.

Você pode alterar qual forma está sendo redimensionada alterando o alvo ao pressionar o mouse.

Para formas muito irregulares, você pode exibir a caixa delimitadora da forma quando o usuário passar para essa caixa delimitadora.Em seguida, deixe o usuário redimensionar usando as bordas da caixa delimitadora.

Você pode exibir a caixa delimitadora para todos os tipos de formas como destaque quando o mouse estiver na borda de arrastar.A caixa delimitadora torna-se um visual útil para o usuário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top