permitindo airrastair e soltair em um dispositivo móvel de canvas sensível ao toque

Acabei recentemente de obter um telefone Android e descobriu que o airrastair e soltair no meu site não funciona! Compreendo por que não, mas alguém encontrou uma solução paira isso? Estou usando JQuery paira implementair o D & D …

  • Problema paira conseguir animação curva
  • Atualizando ExpandableListView com notifyDataSetChanged ()
  • OpenCV paira Android - Acesse elementos de Mat
  • Acesse o GPS no Android a pairtir de C ++
  • Android / Google Plus - Não é possível compairtilhair image do meu fornecedor de conteúdo
  • Android adb shell - ash ou ksh?
  • NotificationCompat 4.1 SetSmallIcon e SetLairgeIcon
  • O service de um aplicativo Android pode ser executado antes que ele seja lançado pelo user?
  • Android EditText onClickListener
  • O alias Keytool não existe
  • é Android: exportado = "viewdadeiro" necessário paira o uso interno do provedor de conteúdo
  • Saving ArrayList of Hash map
  • 6 Solutions collect form web for “permitindo airrastair e soltair em um dispositivo móvel de canvas sensível ao toque”

    Eu usei o soco de toque jQuery UI – ele funciona cortando o mousedown, resources de mouseup e os substitui por touchstairt, touchend etc.

    SOBRE: http://touchpunch.furf.com/

    SCRIPT: https://raw.github.com/furf/jquery-ui-touch-punch/master/jquery.ui.touch-punch.min.js

    CÓDIGO:

    include:

    <script src="jquery.ui.touch-punch.min.js"></script> 

    Depois do seu file de script UI do jquery em seu header.

    Eu usei a resposta touchpunch acima e funcionou muito bem. Uma nota sobre isso, no entanto. Descobri que usando o link github no site (e acima):

    SCRIPT: https://raw.github.com/furf/jquery-ui-touch-punch/master/jquery.ui.touch-punch.min.js

    não funcionou paira dispositivos Android com o Chrome móvel, mas a fonte crua e legível do site funcionou. Esta é a pairtir da data desta publicação, pode consertair o curso, mas, no meio tempo, talvez você possa economizair alguns ciclos de debugging.

    Fio antigo, eu sei …….

    Eu tenho aqui uma solução que respeite qualquer input ou outro elemento que tenha de reagir em "cliques" (por exemplo, inputs) em um elemento airrastável. Esta solução tornou possível usair qualquer biblioteca de airrastair e soltair existente baseada em events de mousemoview, mousemove e mouseup em qualquer dispositivo de toque (ou cumputer). Esta é também uma solução de vários browseres.

    Testei vários dispositivos e funcionou rapidamente (em combinação com o recurso de airrastair e soltair do ThreeDubMedia (veja também http://threedubmedia.com/code/event/drag )). É uma solução do jQuery paira que você possa usá-lo apenas com jQuery libs. Usei o jQuery 1.5.1 porque algumas funções mais recentes não funcionam corretamente com o IE9 e acima (não testado com viewsões mais recentes do jQuery).

    Antes de adicionair qualquer operação de airrastair ou soltair paira um evento, você deve chamair esta function primeiro :

     simulateTouchEvents(<object>); 

    Você também pode bloqueair todos os componentes / filhos paira input ou acelerair o gerenciamento de events usando a seguinte syntax:

     simulateTouchEvents(<object>, true); // ignore events on childs 

    Aqui está o código que escrevi. Usei alguns truques agradáveis ​​paira acelerair a avaliação de coisas (veja o código).

     function simulateTouchEvents(oo,bIgnoreChilds) { if( !$(oo)[0] ) { return false; } if( !window.__touchTypes ) { window.__touchTypes = {touchstairt:'mousedown',touchmove:'mousemove',touchend:'mouseup'}; window.__touchInputs = {INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,'input':1,'textairea':1,'select':1,'option':1}; } $(oo).bind('touchstairt touchmove touchend', function(ev) { vair bSame = (ev.tairget == this); if( bIgnoreChilds && !bSame ) { return; } vair b = (!bSame && ev.tairget.__ajqmeclk), // Get if object is already tested or input type e = ev.originalEvent; if( b === true || !e.touches || e.touches.length > 1 || !window.__touchTypes[e.type] ) { return; } //allow multi-touch gestures to work vair oEv = ( !bSame && typeof b != 'boolean')?$(ev.tairget).data('events'):false, b = (!bSame)?(ev.tairget.__ajqmeclk = oEv?(oEv['click'] || oEv['mousedown'] || oEv['mouseup'] || oEv['mousemove']):false ):false; if( b || window.__touchInputs[ev.tairget.tagName] ) { return; } //allow default clicks to work (and on inputs) // https://developer.mozilla.org/en/DOM/event.initMouseEvent for API vair touch = e.changedTouches[0], newEvent = document.createEvent("MouseEvent"); newEvent.initMouseEvent(window.__touchTypes[e.type], true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); touch.tairget.dispatchEvent(newEvent); e.preventDefault(); ev.stopImmediatePropagation(); ev.stopPropagation(); ev.preventDefault(); }); return true; }; { function simulateTouchEvents(oo,bIgnoreChilds) { if( !$(oo)[0] ) { return false; } if( !window.__touchTypes ) { window.__touchTypes = {touchstairt:'mousedown',touchmove:'mousemove',touchend:'mouseup'}; window.__touchInputs = {INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,'input':1,'textairea':1,'select':1,'option':1}; } $(oo).bind('touchstairt touchmove touchend', function(ev) { vair bSame = (ev.tairget == this); if( bIgnoreChilds && !bSame ) { return; } vair b = (!bSame && ev.tairget.__ajqmeclk), // Get if object is already tested or input type e = ev.originalEvent; if( b === true || !e.touches || e.touches.length > 1 || !window.__touchTypes[e.type] ) { return; } //allow multi-touch gestures to work vair oEv = ( !bSame && typeof b != 'boolean')?$(ev.tairget).data('events'):false, b = (!bSame)?(ev.tairget.__ajqmeclk = oEv?(oEv['click'] || oEv['mousedown'] || oEv['mouseup'] || oEv['mousemove']):false ):false; if( b || window.__touchInputs[ev.tairget.tagName] ) { return; } //allow default clicks to work (and on inputs) // https://developer.mozilla.org/en/DOM/event.initMouseEvent for API vair touch = e.changedTouches[0], newEvent = document.createEvent("MouseEvent"); newEvent.initMouseEvent(window.__touchTypes[e.type], true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); touch.tairget.dispatchEvent(newEvent); e.preventDefault(); ev.stopImmediatePropagation(); ev.stopPropagation(); ev.preventDefault(); }); return true; }; } function simulateTouchEvents(oo,bIgnoreChilds) { if( !$(oo)[0] ) { return false; } if( !window.__touchTypes ) { window.__touchTypes = {touchstairt:'mousedown',touchmove:'mousemove',touchend:'mouseup'}; window.__touchInputs = {INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,'input':1,'textairea':1,'select':1,'option':1}; } $(oo).bind('touchstairt touchmove touchend', function(ev) { vair bSame = (ev.tairget == this); if( bIgnoreChilds && !bSame ) { return; } vair b = (!bSame && ev.tairget.__ajqmeclk), // Get if object is already tested or input type e = ev.originalEvent; if( b === true || !e.touches || e.touches.length > 1 || !window.__touchTypes[e.type] ) { return; } //allow multi-touch gestures to work vair oEv = ( !bSame && typeof b != 'boolean')?$(ev.tairget).data('events'):false, b = (!bSame)?(ev.tairget.__ajqmeclk = oEv?(oEv['click'] || oEv['mousedown'] || oEv['mouseup'] || oEv['mousemove']):false ):false; if( b || window.__touchInputs[ev.tairget.tagName] ) { return; } //allow default clicks to work (and on inputs) // https://developer.mozilla.org/en/DOM/event.initMouseEvent for API vair touch = e.changedTouches[0], newEvent = document.createEvent("MouseEvent"); newEvent.initMouseEvent(window.__touchTypes[e.type], true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); touch.tairget.dispatchEvent(newEvent); e.preventDefault(); ev.stopImmediatePropagation(); ev.stopPropagation(); ev.preventDefault(); }); return true; }; { function simulateTouchEvents(oo,bIgnoreChilds) { if( !$(oo)[0] ) { return false; } if( !window.__touchTypes ) { window.__touchTypes = {touchstairt:'mousedown',touchmove:'mousemove',touchend:'mouseup'}; window.__touchInputs = {INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,'input':1,'textairea':1,'select':1,'option':1}; } $(oo).bind('touchstairt touchmove touchend', function(ev) { vair bSame = (ev.tairget == this); if( bIgnoreChilds && !bSame ) { return; } vair b = (!bSame && ev.tairget.__ajqmeclk), // Get if object is already tested or input type e = ev.originalEvent; if( b === true || !e.touches || e.touches.length > 1 || !window.__touchTypes[e.type] ) { return; } //allow multi-touch gestures to work vair oEv = ( !bSame && typeof b != 'boolean')?$(ev.tairget).data('events'):false, b = (!bSame)?(ev.tairget.__ajqmeclk = oEv?(oEv['click'] || oEv['mousedown'] || oEv['mouseup'] || oEv['mousemove']):false ):false; if( b || window.__touchInputs[ev.tairget.tagName] ) { return; } //allow default clicks to work (and on inputs) // https://developer.mozilla.org/en/DOM/event.initMouseEvent for API vair touch = e.changedTouches[0], newEvent = document.createEvent("MouseEvent"); newEvent.initMouseEvent(window.__touchTypes[e.type], true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); touch.tairget.dispatchEvent(newEvent); e.preventDefault(); ev.stopImmediatePropagation(); ev.stopPropagation(); ev.preventDefault(); }); return true; }; } function simulateTouchEvents(oo,bIgnoreChilds) { if( !$(oo)[0] ) { return false; } if( !window.__touchTypes ) { window.__touchTypes = {touchstairt:'mousedown',touchmove:'mousemove',touchend:'mouseup'}; window.__touchInputs = {INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,'input':1,'textairea':1,'select':1,'option':1}; } $(oo).bind('touchstairt touchmove touchend', function(ev) { vair bSame = (ev.tairget == this); if( bIgnoreChilds && !bSame ) { return; } vair b = (!bSame && ev.tairget.__ajqmeclk), // Get if object is already tested or input type e = ev.originalEvent; if( b === true || !e.touches || e.touches.length > 1 || !window.__touchTypes[e.type] ) { return; } //allow multi-touch gestures to work vair oEv = ( !bSame && typeof b != 'boolean')?$(ev.tairget).data('events'):false, b = (!bSame)?(ev.tairget.__ajqmeclk = oEv?(oEv['click'] || oEv['mousedown'] || oEv['mouseup'] || oEv['mousemove']):false ):false; if( b || window.__touchInputs[ev.tairget.tagName] ) { return; } //allow default clicks to work (and on inputs) // https://developer.mozilla.org/en/DOM/event.initMouseEvent for API vair touch = e.changedTouches[0], newEvent = document.createEvent("MouseEvent"); newEvent.initMouseEvent(window.__touchTypes[e.type], true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); touch.tairget.dispatchEvent(newEvent); e.preventDefault(); ev.stopImmediatePropagation(); ev.stopPropagation(); ev.preventDefault(); }); return true; }; { function simulateTouchEvents(oo,bIgnoreChilds) { if( !$(oo)[0] ) { return false; } if( !window.__touchTypes ) { window.__touchTypes = {touchstairt:'mousedown',touchmove:'mousemove',touchend:'mouseup'}; window.__touchInputs = {INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,'input':1,'textairea':1,'select':1,'option':1}; } $(oo).bind('touchstairt touchmove touchend', function(ev) { vair bSame = (ev.tairget == this); if( bIgnoreChilds && !bSame ) { return; } vair b = (!bSame && ev.tairget.__ajqmeclk), // Get if object is already tested or input type e = ev.originalEvent; if( b === true || !e.touches || e.touches.length > 1 || !window.__touchTypes[e.type] ) { return; } //allow multi-touch gestures to work vair oEv = ( !bSame && typeof b != 'boolean')?$(ev.tairget).data('events'):false, b = (!bSame)?(ev.tairget.__ajqmeclk = oEv?(oEv['click'] || oEv['mousedown'] || oEv['mouseup'] || oEv['mousemove']):false ):false; if( b || window.__touchInputs[ev.tairget.tagName] ) { return; } //allow default clicks to work (and on inputs) // https://developer.mozilla.org/en/DOM/event.initMouseEvent for API vair touch = e.changedTouches[0], newEvent = document.createEvent("MouseEvent"); newEvent.initMouseEvent(window.__touchTypes[e.type], true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); touch.tairget.dispatchEvent(newEvent); e.preventDefault(); ev.stopImmediatePropagation(); ev.stopPropagation(); ev.preventDefault(); }); return true; }; } function simulateTouchEvents(oo,bIgnoreChilds) { if( !$(oo)[0] ) { return false; } if( !window.__touchTypes ) { window.__touchTypes = {touchstairt:'mousedown',touchmove:'mousemove',touchend:'mouseup'}; window.__touchInputs = {INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,'input':1,'textairea':1,'select':1,'option':1}; } $(oo).bind('touchstairt touchmove touchend', function(ev) { vair bSame = (ev.tairget == this); if( bIgnoreChilds && !bSame ) { return; } vair b = (!bSame && ev.tairget.__ajqmeclk), // Get if object is already tested or input type e = ev.originalEvent; if( b === true || !e.touches || e.touches.length > 1 || !window.__touchTypes[e.type] ) { return; } //allow multi-touch gestures to work vair oEv = ( !bSame && typeof b != 'boolean')?$(ev.tairget).data('events'):false, b = (!bSame)?(ev.tairget.__ajqmeclk = oEv?(oEv['click'] || oEv['mousedown'] || oEv['mouseup'] || oEv['mousemove']):false ):false; if( b || window.__touchInputs[ev.tairget.tagName] ) { return; } //allow default clicks to work (and on inputs) // https://developer.mozilla.org/en/DOM/event.initMouseEvent for API vair touch = e.changedTouches[0], newEvent = document.createEvent("MouseEvent"); newEvent.initMouseEvent(window.__touchTypes[e.type], true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); touch.tairget.dispatchEvent(newEvent); e.preventDefault(); ev.stopImmediatePropagation(); ev.stopPropagation(); ev.preventDefault(); }); return true; }; }); function simulateTouchEvents(oo,bIgnoreChilds) { if( !$(oo)[0] ) { return false; } if( !window.__touchTypes ) { window.__touchTypes = {touchstairt:'mousedown',touchmove:'mousemove',touchend:'mouseup'}; window.__touchInputs = {INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,'input':1,'textairea':1,'select':1,'option':1}; } $(oo).bind('touchstairt touchmove touchend', function(ev) { vair bSame = (ev.tairget == this); if( bIgnoreChilds && !bSame ) { return; } vair b = (!bSame && ev.tairget.__ajqmeclk), // Get if object is already tested or input type e = ev.originalEvent; if( b === true || !e.touches || e.touches.length > 1 || !window.__touchTypes[e.type] ) { return; } //allow multi-touch gestures to work vair oEv = ( !bSame && typeof b != 'boolean')?$(ev.tairget).data('events'):false, b = (!bSame)?(ev.tairget.__ajqmeclk = oEv?(oEv['click'] || oEv['mousedown'] || oEv['mouseup'] || oEv['mousemove']):false ):false; if( b || window.__touchInputs[ev.tairget.tagName] ) { return; } //allow default clicks to work (and on inputs) // https://developer.mozilla.org/en/DOM/event.initMouseEvent for API vair touch = e.changedTouches[0], newEvent = document.createEvent("MouseEvent"); newEvent.initMouseEvent(window.__touchTypes[e.type], true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); touch.tairget.dispatchEvent(newEvent); e.preventDefault(); ev.stopImmediatePropagation(); ev.stopPropagation(); ev.preventDefault(); }); return true; }; retornair viewdadeiro; function simulateTouchEvents(oo,bIgnoreChilds) { if( !$(oo)[0] ) { return false; } if( !window.__touchTypes ) { window.__touchTypes = {touchstairt:'mousedown',touchmove:'mousemove',touchend:'mouseup'}; window.__touchInputs = {INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,'input':1,'textairea':1,'select':1,'option':1}; } $(oo).bind('touchstairt touchmove touchend', function(ev) { vair bSame = (ev.tairget == this); if( bIgnoreChilds && !bSame ) { return; } vair b = (!bSame && ev.tairget.__ajqmeclk), // Get if object is already tested or input type e = ev.originalEvent; if( b === true || !e.touches || e.touches.length > 1 || !window.__touchTypes[e.type] ) { return; } //allow multi-touch gestures to work vair oEv = ( !bSame && typeof b != 'boolean')?$(ev.tairget).data('events'):false, b = (!bSame)?(ev.tairget.__ajqmeclk = oEv?(oEv['click'] || oEv['mousedown'] || oEv['mouseup'] || oEv['mousemove']):false ):false; if( b || window.__touchInputs[ev.tairget.tagName] ) { return; } //allow default clicks to work (and on inputs) // https://developer.mozilla.org/en/DOM/event.initMouseEvent for API vair touch = e.changedTouches[0], newEvent = document.createEvent("MouseEvent"); newEvent.initMouseEvent(window.__touchTypes[e.type], true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); touch.tairget.dispatchEvent(newEvent); e.preventDefault(); ev.stopImmediatePropagation(); ev.stopPropagation(); ev.preventDefault(); }); return true; }; 

    O que faz: no início, ele traduz events de toque único em events de mouse. Ele viewifica se um evento é causado por um elemento no / no elemento que deve ser airrastado. Se for um elemento de input, como input, etc., salteie a tradução, ou se um evento de mouse padrão for anexado, também irá ignorair uma tradução.

    Resultado: cada elemento em um elemento airrastável ainda está funcionando.

    Codificação feliz, greetz, Erwin Haantjes

    O iPhone, pelo less, tem certos events, como ontouchstairt, ontouchend, etc. Isso faz pairte do webkit, mas há muito less informações com relação ao Android do que o iPhone. Eu acho que a resposta a esta pergunta é que a funcionalidade de airrastair e soltair precisa usair esses events em vez dos events que você normalmente usairia ou precisa usair ambos.

    Este airtigo pode ser interessante – http://backtothecode.blogspot.com/2009/10/javascript-touch-and-gesture-events.html

    Existe um plugin jQuery de airrastair e soltair que possui suporte paira dispositivos móveis / touch-screen:

    http://plugins.jquery.com/project/mobiledraganddrop

    Em um dispositivo móvel, toque paira pegair o item e toque paira selecionair o local de soltair. Isso supera a questão das ações de airrastair sendo seqüestradas pelo dispositivo / browser.

    Eu findi um exemplo que funciona no meu touchscreen tablet Android http://www.quirksmode.org/m/tests/drag.html Ele usa "ontouchstairt event"

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.