ScaleGestureDetector não detecta o final do gesto
-
27-09-2019 - |
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?
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 MotionEvent
s 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.