Pergunta

Conectei um ScaleGestureDetector a um OnTouchListener conforme instruído na documentação do Android.Por alguma razão, o ScaleGestureDetector nem sempre detecta o final de um gesto de pinça.Isso acontece principalmente ao beliscar rapidamente, de grande para pequeno.

O efeito é que depois de soltar os dois dedos, o detector não dispara o evento de finalização do gesto.Se eu tocar na tela com um depois, ele ainda pensará que estou continuando o gesto de escala (continua disparando eventos onScale).Tenho que fazer outro gesto para que o detector dispare o evento final.

Adicionei logs ao OnTouchListener e quando o gesto de escala trava, ainda recebo eventos de movimento normalmente ao usar um dedo e event.getPointerCount() é 1.

Eu me certifiquei de não ter nenhum outro ouvinte intervindo.A visualização que possui o onTouchListener não é a única visualização na tela, mas esse efeito acontece também quando tenho muito cuidado ao iniciar e terminar o gesto dentro desta visualização.

Existe alguma maneira de melhorar a detecção final?

Ou se houver uma maneira de definir manualmente o ScaleGestureDetector para disparar onScaleEnd e alterar scaleGestureDetector.isInProgress() para falso?

Foi útil?

Solução

Encontrei uma solução depois de aplicar a correção acima.Meu aplicativo usa um ScaleGestureDetector e um normal GestureDetector então eu implementei no meu onScroll método (do GestureDetector):

if (m_dualFingerGestureDetector.isInProgress() && (evt1.getPointerCount() == 2 || evt2.getPointerCount == 2)
{
    return false;
}
...

Minhas variáveis ​​são as seguintes:

m_dualFingerGestureDetector é meu ScaleGestureDetector
evt1 e evt2 são MotionEvents para um gesto de arrastar.Se você tiver apenas um evento, poderá encurtar o código acima:

if (m_dualFingerGestureDetector.isInProgress() && evt.getPointerCount() == 2)
{
    return false;
}
...

Isso permite muito interfaces de usuário agradáveis ​​a serem construídas.Eu sempre recomendaria usar a combinação de detectores de gestos para adicionar recursos de panorâmica e zoom ao seu aplicativo.

Outras dicas

Você pode estar correndo para o seguinte bughttp://code.google.com/p/android/issues/detail?id=10067

Eu tive que copiar a implementação do ScaleGestureTector no meu projeto local para poder aplicar a correção. Também estou direcionando os dispositivos 2.1 para que essa classe não esteja disponível para mim, a menos que eu o copie no meu projeto.

https://android.googlesource.com/platform/frameworks/base/+/gingerbread-release/core/java/android/view/scalegestureTector.java

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