Como usar rotationAngle e touchRadius

Uma mudança relativamente pequena na API Touch no Chrome foi lançada no Chrome 39, que apresentou uma versão funcional do atributo webkitRotationAngle no objeto TouchEvent. Agora, no Chrome 45 (Beta em julho de 2015), o prefixo foi removido e ele é rotationAngle, o que alinha nossa implementação com a especificação do TouchEvent e o Firefox.

Embora já exista há algum tempo, vale a pena explicar o que é rotationAngle, já que ele permite um uso mais interessante de gestos de toque, especialmente em dispositivos móveis.

Tecnicamente, o ângulo de rotação é o número de graus (entre 0 e 90) da elipse da área de contato definida por Touch.radiusX e Touch.radiusY. Legal, certo? Descobri que o Chrome no Android não bloqueia os valores radiusX e radiusY em 64 px, mas variáveis, dependendo do tamanho de contato da tela.

O que isso significa?

Pense nisso como uma maneira de representar com precisão o tamanho, a forma e a orientação do dedo do usuário em uma tela. Os usuários nem sempre tocam na tela com a ponta do dedo, mas pressionam a tela com frequência, como se estivessem uma impressão digital para a polícia. Sem o rotationAngle, você saberia apenas a largura e a altura do gesto de toque. Com o rotationAngle, você recebe 90 graus de rotação (0 é vertical e 90 é horizontal). Por que apenas 90 graus? Você só precisa dos 90 graus porque, à medida que você passa por esses ângulos, o radiusX e o radiusY mudam para se acomodar.

Outra coisa legal é que a área de contato do dedo do usuário muda conforme o grau de pressão do dedo na tela. Ele não é uma substituição direta para force, mas você pode distinguir entre pincéis leves na tela porque eles têm uma área de superfície menor do que uma pressão mais forte.

Como posso usar?

Primeiro, você precisa de um dispositivo que possa detectar isso. Um Nexus 10 vai funcionar bem. Um ótimo exemplo é olhar diretamente para o exemplo de pintura de Rick Byers. Para não ficar para trás, aqui está uma maneira de usar sem tela.

var touchHandler = function(e) {
    e.preventDefault();
    var touches = e.changedTouches;
    var touch = touches[0]; // only concerned about first touch.
    
    var rotationAngle = touch.rotationAngle || touch.webkitRotationAngle || 0;
    var radiusX = touch.radiusX || touch.webkitRadiusX || 1;
    var radiusY = touch.radiusY || touch.webkitRadiusY || 1;
    var force = touch.force || touch.webkitForce || 0;
    
    // Use the rotationAngle to rotate the 'p' element.
    
    p.style.width = radiusX * 2 + 'px';
    p.style.height = radiusY * 2 + 'px';
    p.style.transform = "rotate(" + rotationAngle + "deg)";
};

document.documentElement.ontouchstart = touchHandler;
document.documentElement.ontouchend = touchHandler;
document.documentElement.ontouchmove = touchHandler;

Onde você usaria isso na prática?

Há alguns lugares óbvios em que isso seria um benefício imediato para o usuário:

  • Por exemplo, apps da Web de pintura e manipulação de imagens podem usar essas informações para alterar o traço ou os efeitos aplicados à tela. Você pode usar o raio de toque para alterar o tamanho do pincel e combiná-lo no rotationAngle para variar o ângulo de contato do pincel na tela.
  • Reconhecimento de gestos aprimorado: se você entender o rotationAngle, poderá criar um gesto de um único dedo para girar um objeto.

Todos os dispositivos são compatíveis?

Não. Ainda não é muito comum. Se você tiver um Nexus 10, verá algo como o seguinte:

Captura de tela da rotação do ângulo de toque

Crédito da imagem: Rick Byers.

Quando um dispositivo não consegue entender o ângulo de rotação de um toque, o rotationAngle será 0 e os valores radiusX e radiusY serão iguais, mas podem variar dependendo da área da superfície de toque atual.

Pra que comer isso?

Boa pergunta. Como muitos recursos na Web, essa é uma experiência complementar.
Os eventos de toque vão funcionar quando houver suporte e, se os valores de raio e rotação estiverem disponíveis, você poderá aprimorar seu aplicativo para oferecer ao usuário uma experiência mais eficiente. Nem todos os usuários têm um tablet Wacom, mas, quando presentes, muitos aplicativos de pintura aproveitam essa tecnologia.

E os eventos de ponteiro?

Isso é apenas para garantir que temos uma API de evento de toque completa para os desenvolvedores que dependem dela. Veja como eu evitei a pergunta... Mas, sério, se você tiver interesse em acompanhar a implementação do PointerEvent do Blink, marque com uma estrela a Issue 471824 e leia o documento de rastreamento de Rick Byers.

Ver também