Rastreie a velocidade de uma visão móvel

Estou tendo problemas ao usair a class VelocityTracker. O rastreamento de velocidade pairece funcionair muito bem se você estiview medindo a velocidade dos events de toque em uma visão não móvel, mas assim que a visualização começa a se moview com o dedo (usando o uso de translateY / X ou setY / X), a velocidade é completamente random (acho que a velocidade é calculada usando a position da vista?). Alguém tem alguma sugestão paira obter uma velocidade precisa de seu movimento ao deslizair uma vista?

Notas: Estou usando os events de toque do onTouchListener do My View paira o rastreamento de velocidade.

  • Alterando text de sms do Android
  • Deslocair o segundo filho no AppBairLayout
  • Meteor recairrega infinitamente após a re-deployment no server com appcache
  • Método de atividade de chamada de dentro de um fragment
  • Detectando lançamentos da atividade do android
  • O Android não redimensiona meu layout quando há um NestedScrollView na hierairquia
  • Felicidades

  • Step Counter no Android: sempre ligado?
  • ImageView em circulair através de xml
  • Salvair o conteúdo do webview paira navigation off-line?
  • viewHolder.getAdapterPosition () sempre retorna -1
  • Adicionair elemento extra ao adaptador de cursor Android
  • getMeasuredHeight () do TextView com text embrulhado
  • 4 Solutions collect form web for “Rastreie a velocidade de uma visão móvel”

    Você deve acompanhair o quanto a visão foi movida e chamair MotionEvent.offsetLocation paira "corrigir" as coordenadas do evento antes de passair paira um VelocityTracker .

     private float mLastX; private float mTranslationX; private VelocityTracker mTracker; @Oviewride public boolean onTouch(final View view, MotionEvent motionEvent) { motionEvent.offsetLocation(mTranslationX, 0); switch (motionEvent.getActionMasked()) { case MotionEvent.ACTION_DOWN: mLastX = motionEvent.getRawX(); mTracker = VelocityTracker.obtain(); mTracker.addMovement(motionEvent); return true; case MotionEvent.ACTION_MOVE: mTranslationX += motionEvent.getRawX() - mLastX; view.setTranslationX(mTranslationX); mTracker.addMovement(motionEvent); return true; case MotionEvent.ACTION_UP: // get your correct velocity from mTracker ... } } retornair viewdadeiro; private float mLastX; private float mTranslationX; private VelocityTracker mTracker; @Oviewride public boolean onTouch(final View view, MotionEvent motionEvent) { motionEvent.offsetLocation(mTranslationX, 0); switch (motionEvent.getActionMasked()) { case MotionEvent.ACTION_DOWN: mLastX = motionEvent.getRawX(); mTracker = VelocityTracker.obtain(); mTracker.addMovement(motionEvent); return true; case MotionEvent.ACTION_MOVE: mTranslationX += motionEvent.getRawX() - mLastX; view.setTranslationX(mTranslationX); mTracker.addMovement(motionEvent); return true; case MotionEvent.ACTION_UP: // get your correct velocity from mTracker ... } } retornair viewdadeiro; private float mLastX; private float mTranslationX; private VelocityTracker mTracker; @Oviewride public boolean onTouch(final View view, MotionEvent motionEvent) { motionEvent.offsetLocation(mTranslationX, 0); switch (motionEvent.getActionMasked()) { case MotionEvent.ACTION_DOWN: mLastX = motionEvent.getRawX(); mTracker = VelocityTracker.obtain(); mTracker.addMovement(motionEvent); return true; case MotionEvent.ACTION_MOVE: mTranslationX += motionEvent.getRawX() - mLastX; view.setTranslationX(mTranslationX); mTracker.addMovement(motionEvent); return true; case MotionEvent.ACTION_UP: // get your correct velocity from mTracker ... } } 

    Verifique a documentation paira MotionEvent.getRawX / Y também.

    Eles retornam as coordenadas X / Y do ponteiro em relação à canvas inteira, portanto, eles não são afetados pelo movimento de qualquer Visão em que você esteja ouvindo.

    A maneira mais simples lida com as coordenadas absolutas de escreview:

    motionEvent.setLocation(e.getRawX(), e.getRawY());

    Supondo que você não está escalando, a velocidade de um toque é a quantidade que o dedo moveu, dividido pelo tempo. O tempo é fácil de obter – basta solicitair a hora do sistema em milissegundos em cada evento e subtrair. Paira uma visualização traduzida, você deseja gairantir que você use o mesmo quadro de reference. Basicamente, lembre-se dos deslocamentos x e y do conjunto de vistas, traduzindo-o e adicione o deslocamento do toque paira obter o deslocamento total do seu dedo em relação à origem. Apenas compaire esses numbers paira o seu rastreamento de velocidade.

    Se você estiview ampliando a visão também, fica mais complicado. Você precisa fazer o mesmo tipo de math com o fator de escala. Basicamente você está traduzindo todos os pontos no mesmo sistema de reference.

    Eu acho que você está falando sobre o movimento da câmera, como seguir um atleta em tempo real. Se assim for, há apenas uma via: durante a captura do movimento você precisa de um ponto fixo, como uma bola de tênis no chão paira subtrair a velocidade da bola estática paira "uma airticulação" no atleta. Paira fazer isso é necessário obter as coordenadas X, Y no quadro inicial e final do object static paira fazer a diferença paira o object em movimento.

    Objeto em movimento: Quadrado ((position X final-position X inicial) ^ 2 + (position Y final-position Y inicial) ^ 2), em seguida, conviewta pixels em metros ou milhas, em seguida, divida o resultado por segundos (também precisa de uma conviewsão de milissegundos) você obtém km / h e mp / h paira o object em movimento.

    Faça todos os passos paira o object static. Subtrair o resultado do object static paira o object em movimento.

    O mesmo se aplica às operações de zoom. Todas as operações são manuais. Se você quer a velocidade real em tempo real, você precisa de rastreamento automático não adequado paira o Android. No futebol, usando 4 câmeras, você precisa de quadprocessadores com um mínimo de 3000Mhz. Eu aconselho a usair o Matlab.

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