Quero que a fling
detecção de gestos funcione no meu aplicativo Android.
O que eu tenho é um GridLayout
que contém 9 ImageView
s. A fonte pode ser encontrada aqui: Grid Layout da Romain Guys .
Esse arquivo é do aplicativo Photostream de Romain Guy e foi apenas ligeiramente adaptado.
Para a situação de clique simples, preciso definir apenas o onClickListener
para cada um ImageView
que adiciono como o principal activity
que implementa View.OnClickListener
. Parece infinitamente mais complicado implementar algo que reconhece a fling
. Presumo que isso é porque pode abranger views
?
Se minha atividade é implementada
OnGestureListener
, não sei como defini-lo como ouvinte de gestos para asGrid
ou asImage
visualizações que adiciono.public class SelectFilterActivity extends Activity implements View.OnClickListener, OnGestureListener { ...
Se minha atividade é implementada
OnTouchListener
, não tenho umonFling
método paraoverride
(ela tem dois eventos como parâmetros, permitindo-me determinar se o caso foi digno de nota).public class SelectFilterActivity extends Activity implements View.OnClickListener, OnTouchListener { ...
Se eu criar um costume
View
, assimGestureImageView
prolongadoImageView
, não sei como dizer à atividade quefling
ocorreu uma a partir da visualização. De qualquer forma, tentei isso e os métodos não foram chamados quando toquei na tela.
Eu realmente só preciso de um exemplo concreto desse trabalho entre pontos de vista. O que, quando e como devo anexar isso listener
? Também preciso detectar cliques únicos.
// Gesture detection
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
int dx = (int) (e2.getX() - e1.getX());
// don't accept the fling if it's too short
// as it may conflict with a button push
if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.absvelocityY)) {
if (velocityX > 0) {
moveRight();
} else {
moveLeft();
}
return true;
} else {
return false;
}
}
});
É possível colocar uma visão transparente por cima da minha tela para capturar arremessos?
Se eu optar por não inflate
exibir as imagens da imagem filha no XML, posso passar o GestureDetector
parâmetro como construtor para uma nova subclasse ImageView
criada por mim?
Esta é a atividade muito simples para a qual estou tentando fazer a fling
detecção funcionar: SelectFilterActivity (Adaptado do photostream) .
Eu estive olhando para estas fontes:
Nada funcionou para mim até agora e eu estava esperando por algumas dicas.
Respostas:
Obrigado ao Code Shogun , cujo código eu adaptei à minha situação.
Deixe sua atividade implementar
OnClickListener
como de costume:Anexe seu ouvinte a todas as visualizações adicionadas ao layout principal;
Observe com admiração como seus métodos substituídos são atingidos, tanto
onClick(View v)
da atividade quanto doonFling
ouvinte de gestos.A dança pós-arremesso é opcional, mas incentivada.
fonte
Uma das respostas acima menciona lidar com diferentes densidades de pixels, mas sugere calcular manualmente os parâmetros de furto. Vale a pena notar que você pode realmente obter valores razoáveis e em escala do sistema usando a
ViewConfiguration
classe:Percebi que o uso desses valores faz com que a "sensação" de arremessar seja mais consistente entre o aplicativo e o restante do sistema.
fonte
swipeMinDistance = vc.getScaledPagingTouchSlop()
eswipeMaxOffPath = vc.getScaledTouchSlop()
.getScaledTouchSlop
dá-me muito pouco resultado de deslocamento, sem jeito. Por exemplo, apenas 24 pixels em uma tela com 540 pontos de altura, é muito difícil mantê-la ao alcance com o dedo. : SEu faço isso um pouco diferente e escrevi uma classe de detector extra que implementa o
View.onTouchListener
onCreate
é simplesmente adicioná-lo ao layout mais baixo como este:em que id.lowestLayout é o id.xxx para a exibição mais baixa na hierarquia de layout e o lowerLayout é declarado como RelativeLayout
E há a classe real do detector de furto de atividade:
Funciona muito bem para mim!
fonte
Modifiquei e consertei levemente a solução de Thomas Fankhauser
Todo o sistema consiste em dois arquivos, SwipeInterface e ActivitySwipeDetector
SwipeInterface.java
Detector
é usado assim:
E na implementação,
Activity
você precisa implementar métodos do SwipeInterface e pode descobrir em qual evento View the Swipe foi chamado.fonte
v.performClick();
que é usado para não consumir evento para OnClickListener, se definido no mesmo ponto de vistaO código do detector de gestos de furto acima é muito útil! No entanto, você pode desejar agnóstico desta densidade de solução usando os seguintes valores relativos,
(REL_SWIPE)
em vez dos valores absolutos(SWIPE_)
fonte
Minha versão da solução proposta por Thomas Fankhauser e Marek Sebera (não lida com furtos verticais):
SwipeInterface.java
ActivitySwipeDetector.java
fonte
Essa pergunta é antiga e, em julho de 2011, o Google lançou o Pacote de Compatibilidade, revisão 3), que inclui o
ViewPager
que funciona com o Android 1.6 em diante. AsGestureListener
respostas postadas para esta pergunta não parecem muito elegantes no Android. Se você está procurando o código usado para alternar entre fotos na Galeria Android ou alternar visualizações no novo aplicativo Play Market, então é definitivamenteViewPager
.Aqui estão alguns links para mais informações:
fonte
Há uma interface interna que você pode usar diretamente para todos os gestos:
Aqui está uma explicação para um usuário de nível básico: Existem 2 importações com cuidado ao escolher que ambas são diferentes
fonte
Há alguma proposta na Web (e nesta página) para usar o ViewConfiguration. getScaledTouchSlop () para ter um valor em escala de dispositivo
SWIPE_MIN_DISTANCE
.getScaledTouchSlop()
destina-se à distância do "limite de rolagem ", não ao deslize. A distância do limite de rolagem deve ser menor que a distância do limite "oscilação entre a página". Por exemplo, essa função retorna 12 pixels no meu Samsung GS2 e os exemplos citados nesta página são de aproximadamente 100 pixels.Com a API nível 8 (Android 2.2, Froyo), você tem o
getScaledPagingTouchSlop()
objetivo de deslizar a página. No meu dispositivo, ele retorna 24 (pixels). Portanto, se você estiver no nível da API <8, acho que "2 *getScaledTouchSlop()
" deve ser o limite de furto "padrão". Mas os usuários do meu aplicativo com telas pequenas me disseram que era muito pouco ... Como no meu aplicativo, você pode rolar verticalmente e alterar a página horizontalmente. Com o valor proposto, eles às vezes mudam de página em vez de rolar.fonte
Também como um aprimoramento menor.
O principal motivo do bloco try / catch é que e1 pode ser nulo para o movimento inicial. além da tentativa / captura, inclua um teste para nulo e retorno. semelhante ao seguinte
fonte
Há muitas informações excelentes aqui. Infelizmente, muito desse código de processamento de lançamentos está espalhado por vários sites em vários estados de conclusão, mesmo que alguém pense que isso é essencial para muitos aplicativos.
Eu dediquei um tempo para criar um ouvinte que verifica se as condições apropriadas são atendidas. Adicionei um ouvinte de arremesso de página que adiciona mais verificações para garantir que os arremessos atendam ao limite de arremessos de página. Ambos os ouvintes permitem restringir facilmente os arremessos ao eixo horizontal ou vertical. Você pode ver como é usado em uma exibição para imagens deslizantes . Reconheço que as pessoas aqui fizeram a maior parte da pesquisa - acabei de montá-la em uma biblioteca utilizável.
Esses últimos dias representam minha primeira tentativa de codificação no Android; esperar muito mais por vir.
fonte
Esta é uma resposta combinada das duas respostas na parte superior, se alguém quiser uma implementação funcional.
fonte
absDeltaY > minSwipeDelta
,absVelocityY > minSwipeVelocity
,absVelocityY < maxSwipeVelocity
apenas em caso seminSwipeDelta
! =getScaledTouchSlop
,minSwipeVelocity
! =getScaledMinimumFlingVelocity
,maxSwipeVelocity
! =getScaledMaximumFlingVelocity
, Ou seja, verificar se os chamados “default” (quero dizer getScaledTouchSlop, getScaledMinimumFlingVelocity, getScaledMaximumFlingVelocity) valores são escalados ou alterado de acordo com sua próprio desejo.ACTION_UP
, nãoACTION_MOVE
ouACTION_POINTER_UP
, ou seja, apenas como resultado do gesto plenamente realizado). (Eu não verifiquei outras versões da API, portanto, os comentários são apreciados).Você pode usar a biblioteca droidQuery para lidar com arremessos, cliques, cliques longos e eventos personalizados. A implementação é baseada na minha resposta anterior abaixo, mas o droidQuery fornece uma sintaxe simples e simples:
Resposta original
Esta resposta usa uma combinação de componentes das outras respostas aqui. Consiste na
SwipeDetector
classe, que possui uma interface interna para escutar eventos. Também forneço umRelativeLayout
para mostrar como substituirView
oonTouch
método de uma para permitir eventos de furto e outros eventos detectados (como cliques ou cliques longos).SwipeDetector
Swipe Interceptor View
fonte
SwipeInterceptorView
, portanto, o clique é tratado primeiro. Você pode corrigir isso implementando seu próprio mecanismo de clique, implementandoonTouchListener
ou, como solução alternativa, pode ouvir cliques longos em vez de cliques (consulteView.setOnLongClickListener
).Sei que é tarde demais para responder, mas ainda estou publicando a Detecção de furto no ListView que Como usar o Swipe Touch Listener no Item do ListView .
Refrence: Exterminator13 (uma das respostas nesta página)
Faça um ActivitySwipeDetector.class
Chame-o da sua classe de atividades assim:
E não se esqueça de implementar o SwipeInterface, que fornecerá dois métodos @override:
fonte
MAX_OFF_PATH = 5 * vc.getScaledPagingTouchSlop()
é mais confortável para um deslizar do polegar naturalmente viajando em um leve arco.Gestos são movimentos sutis para acionar interações entre a tela sensível ao toque e o usuário. Dura o tempo entre o primeiro toque na tela e o ponto em que o último dedo sai da superfície.
Android nos fornece uma classe chamada GestureDetector usando o que podemos detectar gestos comuns, como tocar baixo e para cima, passando verticalmente e horizontalmente (aventura), de longo e curto imprensa, torneiras duplas, etc . e anexar ouvintes a eles.
Faça nossa classe Activity implementar GestureDetector.OnDoubleTapListener (para detecção de gesto com toque duplo) e GestureDetector.OnGestureListener interfaces e implementar todos os métodos abstratos. Para obter mais informações. você pode visitar https://developer.android.com/training/gestures/detector.html . Cortesia
Para teste de demonstração. GestureDetectorDemo
fonte
Se você não deseja criar uma classe separada ou tornar o código complexo,
basta criar uma variável GestureDetector dentro do OnTouchListener e tornar seu código mais fácil
namVyuVar pode ser qualquer nome da Visualização na qual você precisa definir o listner
fonte
Para todos: não se esqueça do caso MotionEvent.ACTION_CANCEL:
chama em 30% furtos sem ACTION_UP
e é igual a ACTION_UP neste caso
fonte
Anexei uma classe mais genérica, peguei a classe de Tomas e adicionei uma interface que envia eventos para sua atividade ou fragmento. ele registrará o ouvinte no construtor, portanto, certifique-se de implementar a interface ou uma ClassCastException será exibida. a interface retorna um dos quatro int finais definidos na classe e retornará a visualização na qual foi ativada.
fonte