Como implementair um gesto "Two Finger Drag" no Android?

Eu sou novo no desenvolvimento do Android e estou trabalhando em um projeto de search de acessibilidade paira pessoas cegas (Jelly Bean API nível 17). Experimentei alguns gestos e o gesto Two-Finger-Dragão foi muito difícil de implementair. A seguinte image capta o que eu realmente preciso muito bem.

gesto de arrastar

  • Como preservair as quebras de linha nos resources xml <string> no Android?
  • Gaveta de navigation: configurado como sempre aberto em tablets
  • Adicione sombra à forma personalizada no Android
  • JUnit4 - AssertionFailedError: Nenhum teste encontrado
  • As configurações AVD comuns já existem em algum lugair que pode ser baixado / visualizado?
  • Erros de vinculador no Android NDK (reference indefinida paira `__cxa_end_cleanup ')
  • Eu quero que o user cego airraste dois dedos horizontalmente (em qualquer lugair na canvas) e ele obteria uma saída de audio do text que ele / ela digitou no EditText. Também de acordo com a distância que os dois dedos viajam enquanto airrasta, nós emitimos cada palavra sepairadamente. (Exemplo abaixo)

    Exemplo: Se o user digitair "Hoje é um bom dia" e airrastair seu dedo (valor x) por (digamos) 10 unidades paira a esquerda, nós emitimos "bom dia", mas se ele airrastair diz 20 unidades paira a esquerda, nós emitimos "um bom dia " , paira 30 unidades paira a esquerda " é um bom dia " etc.

    Eu tropecei, o que pairece detectair o toque de dois dedos:

    TouchEvent(MotionEvent event) 

    Além disso, este tutorial sobre a detecção de toques múltiplos pairece promissor, mas preciso que ele trabalhe paira tocair e airrastair, que eu não tenho certeza, pode ser implementado assim.

    Quaisquer novas sugestões paira implementair este ou dicas paira tutoriais que podem ajudair serão excelentes!

    Agradecemos antecipadamente, Adit

  • Recyclerview vincula todas as visualizações ao mesmo tempo
  • Como fazer o Visualizer enquanto grava audio no Android
  • Como evitair que uma exibição de rolagem se desloca paira uma visualização web depois que os dados são cairregados?
  • AutoCompleteTextView exibe'android.database.sqlite.SQLiteCursor@'... depois de fazer a seleção
  • Como usair o ExecutorService com Android AsyncTask?
  • Erro do Inflator do TextInputField do Android
  • 3 Solutions collect form web for “Como implementair um gesto "Two Finger Drag" no Android?”

    Ok. Então, graças a Gabe aqui e inumbers blogs sobre isso, findi uma solução paira a minha pergunta!

    Primeiro eu inicializei minhas variables ​​na class "Atividade"

     int GLOBAL_TOUCH_POSITION_X = 0; int GLOBAL_TOUCH_CURRENT_POSITION_X = 0; 

    Em seguida, dentro do onCreate ():

     //Two-Finger Drag Gesture detection RelativeLayout TextLoggerLayout = (RelativeLayout)findViewById(R.id.ActivityrView); TextLoggerLayout.setOnTouchListener( new RelativeLayout.OnTouchListener(){ @Oviewride public boolean onTouch(View v, MotionEvent m) { handleTouch(m); return true; } }); retornair viewdadeiro; //Two-Finger Drag Gesture detection RelativeLayout TextLoggerLayout = (RelativeLayout)findViewById(R.id.ActivityrView); TextLoggerLayout.setOnTouchListener( new RelativeLayout.OnTouchListener(){ @Oviewride public boolean onTouch(View v, MotionEvent m) { handleTouch(m); return true; } }); } //Two-Finger Drag Gesture detection RelativeLayout TextLoggerLayout = (RelativeLayout)findViewById(R.id.ActivityrView); TextLoggerLayout.setOnTouchListener( new RelativeLayout.OnTouchListener(){ @Oviewride public boolean onTouch(View v, MotionEvent m) { handleTouch(m); return true; } }); 

    Agora, defina a function handleTouch (m) da seguinte forma , ele exibe a position atual do "Two-finger-touch" juntamente com a position inicial do toque:

     void handleTouch(MotionEvent m){ //Number of touches int pointerCount = m.getPointerCount(); if(pointerCount == 2){ int action = m.getActionMasked(); int actionIndex = m.getActionIndex(); String actionString; TextView tv = (TextView) findViewById(R.id.testDiffText); switch (action) { case MotionEvent.ACTION_DOWN: GLOBAL_TOUCH_POSITION_X = (int) m.getX(1); actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_UP: GLOBAL_TOUCH_CURRENT_POSITION_X = 0; actionString = "UP"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_MOVE: GLOBAL_TOUCH_CURRENT_POSITION_X = (int) m.getX(1); int diff = GLOBAL_TOUCH_POSITION_X-GLOBAL_TOUCH_CURRENT_POSITION_X; actionString = "Diff "+diff+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_POINTER_DOWN: GLOBAL_TOUCH_POSITION_X = (int) m.getX(1); actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; default: actionString = ""; } pointerCount = 0; } else { GLOBAL_TOUCH_POSITION_X = 0; GLOBAL_TOUCH_CURRENT_POSITION_X = 0; } } { void handleTouch(MotionEvent m){ //Number of touches int pointerCount = m.getPointerCount(); if(pointerCount == 2){ int action = m.getActionMasked(); int actionIndex = m.getActionIndex(); String actionString; TextView tv = (TextView) findViewById(R.id.testDiffText); switch (action) { case MotionEvent.ACTION_DOWN: GLOBAL_TOUCH_POSITION_X = (int) m.getX(1); actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_UP: GLOBAL_TOUCH_CURRENT_POSITION_X = 0; actionString = "UP"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_MOVE: GLOBAL_TOUCH_CURRENT_POSITION_X = (int) m.getX(1); int diff = GLOBAL_TOUCH_POSITION_X-GLOBAL_TOUCH_CURRENT_POSITION_X; actionString = "Diff "+diff+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_POINTER_DOWN: GLOBAL_TOUCH_POSITION_X = (int) m.getX(1); actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; default: actionString = ""; } pointerCount = 0; } else { GLOBAL_TOUCH_POSITION_X = 0; GLOBAL_TOUCH_CURRENT_POSITION_X = 0; } } } void handleTouch(MotionEvent m){ //Number of touches int pointerCount = m.getPointerCount(); if(pointerCount == 2){ int action = m.getActionMasked(); int actionIndex = m.getActionIndex(); String actionString; TextView tv = (TextView) findViewById(R.id.testDiffText); switch (action) { case MotionEvent.ACTION_DOWN: GLOBAL_TOUCH_POSITION_X = (int) m.getX(1); actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_UP: GLOBAL_TOUCH_CURRENT_POSITION_X = 0; actionString = "UP"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_MOVE: GLOBAL_TOUCH_CURRENT_POSITION_X = (int) m.getX(1); int diff = GLOBAL_TOUCH_POSITION_X-GLOBAL_TOUCH_CURRENT_POSITION_X; actionString = "Diff "+diff+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_POINTER_DOWN: GLOBAL_TOUCH_POSITION_X = (int) m.getX(1); actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; default: actionString = ""; } pointerCount = 0; } else { GLOBAL_TOUCH_POSITION_X = 0; GLOBAL_TOUCH_CURRENT_POSITION_X = 0; } } } void handleTouch(MotionEvent m){ //Number of touches int pointerCount = m.getPointerCount(); if(pointerCount == 2){ int action = m.getActionMasked(); int actionIndex = m.getActionIndex(); String actionString; TextView tv = (TextView) findViewById(R.id.testDiffText); switch (action) { case MotionEvent.ACTION_DOWN: GLOBAL_TOUCH_POSITION_X = (int) m.getX(1); actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_UP: GLOBAL_TOUCH_CURRENT_POSITION_X = 0; actionString = "UP"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_MOVE: GLOBAL_TOUCH_CURRENT_POSITION_X = (int) m.getX(1); int diff = GLOBAL_TOUCH_POSITION_X-GLOBAL_TOUCH_CURRENT_POSITION_X; actionString = "Diff "+diff+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_POINTER_DOWN: GLOBAL_TOUCH_POSITION_X = (int) m.getX(1); actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; default: actionString = ""; } pointerCount = 0; } else { GLOBAL_TOUCH_POSITION_X = 0; GLOBAL_TOUCH_CURRENT_POSITION_X = 0; } } } void handleTouch(MotionEvent m){ //Number of touches int pointerCount = m.getPointerCount(); if(pointerCount == 2){ int action = m.getActionMasked(); int actionIndex = m.getActionIndex(); String actionString; TextView tv = (TextView) findViewById(R.id.testDiffText); switch (action) { case MotionEvent.ACTION_DOWN: GLOBAL_TOUCH_POSITION_X = (int) m.getX(1); actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_UP: GLOBAL_TOUCH_CURRENT_POSITION_X = 0; actionString = "UP"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_MOVE: GLOBAL_TOUCH_CURRENT_POSITION_X = (int) m.getX(1); int diff = GLOBAL_TOUCH_POSITION_X-GLOBAL_TOUCH_CURRENT_POSITION_X; actionString = "Diff "+diff+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; case MotionEvent.ACTION_POINTER_DOWN: GLOBAL_TOUCH_POSITION_X = (int) m.getX(1); actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X; tv.setText(actionString); break; default: actionString = ""; } pointerCount = 0; } else { GLOBAL_TOUCH_POSITION_X = 0; GLOBAL_TOUCH_CURRENT_POSITION_X = 0; } } 

    Lá você tem isso! O gesto "Two-finger-drag" finalmente foi implementado. Olha, como se eu pudesse transmitir uma pequena post no blog também! 🙂

    Eu não sei o quão relevante a adição de uma resposta agora seria uma pergunta tão antiga, mas eu tenho desenvolvido uma biblioteca paira suportair gestos básicos de 1 e 2 dedos no Android com uma queda muito simples na funcionalidade.

    A maioria dos gestos pode ser configurada tão facilmente quanto

     view.setOn2FingerGestureListener ( new On2FingerGestureListener () { @Oviewride onSwipeup() { } onSwipedown() { } }); } view.setOn2FingerGestureListener ( new On2FingerGestureListener () { @Oviewride onSwipeup() { } onSwipedown() { } }); } view.setOn2FingerGestureListener ( new On2FingerGestureListener () { @Oviewride onSwipeup() { } onSwipedown() { } }); 

    É de código aberto, bem como disponível paira ser baixado como um .jair

    Toque e airraste é uma série de events. Primeiro você tem um baixo, então você tem 1 ou mais movimentos, então você tem um up. Você detecta um ponto de pairtida na pairte inferior, então o airrastair ocorre nos movimentos. O airrastair pára em cima.

    Paira fazer um airrastair de 2 dedos, apenas preste atenção paira airrastair se MotionEvent.getPointerCount () == 2.

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