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

  • Android: getString () de resources perde todas as tags na string
  • Teste da unidade JVM com o Mockito paira testair o Retrofit2 e o RxJava paira solicitações de networking
  • Armazenamento seguro do Android
  • Tab + ViewPager não atualiza em vez disso mostra aviso estranho estado esperado 3 encontrado 2
  • Obter Bitmap do ImageView no Android L
  • O file Keystore não existe
  • 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

  • Android WebView injetair Javascript antes de cairregair html
  • AsyncTask onPostExecute nunca é chamado
  • Mudanças no sistema de files no Android Nougat
  • Melhores práticas paira pubnub no Android
  • Gravair audio no Android com o MediaPlayer como fonte?
  • Qual é a unidade de medida paira duração da mídia no MediaMetadataRetrieview
  • 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.