Verfolgen Sie die Geschwindigkeit einer sich bewegenden Ansicht

8

Bei der Verwendung der VelocityTracker-Klasse treten Probleme auf. Die Geschwindigkeitsmessung funktioniert sehr gut, wenn Sie die Geschwindigkeit von Berührungsereignissen in einer sich nicht bewegenden Ansicht messen, aber sobald sich die Ansicht mit dem Finger bewegt (mit translateY / X oder setY / X), ist die Geschwindigkeit vollständig zufällig (ich denke, die Geschwindigkeit wird anhand der Position der Ansicht berechnet?). Hat jemand irgendwelche Vorschläge, um beim Bewegen einer Ansicht eine genaue Bewegungsgeschwindigkeit zu erhalten?

Hinweise: Ich verwende die Touch-Ereignisse aus dem onTouchListener von View für die Geschwindigkeitsmessung.

Prost

    
Bradley Campbell 04.07.2013, 03:13
quelle

4 Antworten

8

Sie sollten verfolgen, wie weit die Ansicht verschoben wurde, und rufen Sie MotionEvent.offsetLocation , um die Ereigniskoordinaten zu "reparieren", bevor sie an ein VelocityTracker übergeben werden.

%Vor%

Lesen Sie die Dokumentation für MotionEvent.getRawX / Y auch.

Sie geben die X / Y-Koordinaten des Zeigers relativ zum gesamten Bildschirm zurück, daher sind sie von der Bewegung der Ansicht, die Sie gerade hören, nicht betroffen.

    
MartinodF 15.07.2013 06:17
quelle
2
___ antwort43738765 ___

Der einfachste Weg beschäftigt sich mit absoluten Koordinaten schreiben:

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

    
___ qstntxt ___

Bei der Verwendung der VelocityTracker-Klasse treten Probleme auf. Die Geschwindigkeitsmessung funktioniert sehr gut, wenn Sie die Geschwindigkeit von Berührungsereignissen in einer sich nicht bewegenden Ansicht messen, aber sobald sich die Ansicht mit dem Finger bewegt (mit translateY / X oder setY / X), ist die Geschwindigkeit vollständig zufällig (ich denke, die Geschwindigkeit wird anhand der Position der Ansicht berechnet?). Hat jemand irgendwelche Vorschläge, um beim Bewegen einer Ansicht eine genaue Bewegungsgeschwindigkeit zu erhalten?

Hinweise: Ich verwende die Touch-Ereignisse aus dem onTouchListener von View für die Geschwindigkeitsmessung.

Prost

    
___ answer17647849 ___

Sie sollten verfolgen, wie weit die Ansicht verschoben wurde, und rufen Sie %code% , um die Ereigniskoordinaten zu "reparieren", bevor sie an ein %code% übergeben werden.

%Vor%

Lesen Sie die Dokumentation für %code% / %code% auch.

Sie geben die X / Y-Koordinaten des Zeigers relativ zum gesamten Bildschirm zurück, daher sind sie von der Bewegung der Ansicht, die Sie gerade hören, nicht betroffen.

    
___ answer17461510 ___

Unter der Annahme, dass Sie nicht skalieren, ist die Geschwindigkeit einer Berührung die Menge, um die sich Ihr Finger bewegt hat, geteilt durch die Zeit. Die Zeit ist einfach zu bekommen - fordern Sie einfach die Systemzeit in Millisekunden bei jedem Ereignis an und subtrahieren Sie. Bei einer übersetzten Ansicht möchten Sie sicherstellen, dass Sie das gleiche Bezugssystem verwenden. Verfolgen Sie im Wesentlichen den X- und Y-Versatz der Ansicht, indem Sie sie verschieben, und fügen Sie den Versatz der Berührung hinzu, um den Gesamtversatz Ihres Fingers relativ zum Ursprung zu erhalten. Vergleichen Sie nur diese Zahlen für Ihre Geschwindigkeitsverfolgung.

Wenn Sie auch die Ansicht skalieren, wird es komplizierter. Sie müssen die gleiche Art von Mathe mit dem Skalierungsfaktor machen. Im Grunde übersetzt man alle Punkte in ein und dasselbe Referenzsystem.q

    
___ tag123androidview ___ Fragen zu Ansichten in Android. Ansichten können in Android Layout XML oder in Java-Code definiert werden. Fragen, die dieses Tag verwenden, umfassen allgemeine Ansichtspraktiken oder Hinweise. Informationen zu bestimmten Ansichten finden Sie in der Info zu diesem Tag. Bei Fragen zum Layout verwenden Sie [Tag: Android-Layout]. ___ tag123android ___ Android ist das mobile Betriebssystem von Google, das zum Programmieren oder Entwickeln von digitalen Geräten (Smartphones, Tablets, Automobile, Fernseher, Wear, Glass, IoT) verwendet wird. Verwenden Sie für Themen rund um Android Android-spezifische Tags wie android-intent, nicht intent, android-activity, nicht activity, android-adapter, nicht adapter usw. Bei anderen Fragen als der Entwicklung oder Programmierung, aber im Zusammenhang mit Android Framework, verwenden Sie Der Link: https://android.stackexchange.com. ___ answer19531018 ___

Ich denke, Sie sprechen über die Kamerabewegung, als würden Sie einem Athleten in Echtzeit folgen. Wenn ja, gibt es nur einen Weg: Während der Erfassung der Bewegung benötigen Sie einen festen Punkt, wie einen Tennisball im Boden, um die Geschwindigkeit des statischen Balls zu "einem Gelenk" im Athleten zu subtrahieren. Dies ist notwendig, um die X-, Y-Koordinaten im Anfangs- und Endbild des statischen Objekts zu erhalten, um den Unterschied zum bewegten Objekt zu machen.

Bewegliches Objekt: Quadrat ((X Position End-X Position Anfangs) ^ 2 + (Y Position End-Y Position Initial) ^ 2) Dann wandeln Sie Pixel in Meter oder Meilen um dann dividiere das Ergebnis durch Sekunden (benötigt auch eine Umwandlung von Millisekunden) Sie erhalten km / h und mp / h für das bewegte Objekt.

Führen Sie alle Schritte für das statische Objekt aus. Subtrahiere das Ergebnis vom statischen Objekt auf das sich bewegende Objekt.

Das Gleiche gilt für Zoom-Operationen. Alle Operationen sind manuell. Wenn Sie die reale Geschwindigkeit in Echtzeit wollen, brauchen Sie eine automatische Verfolgung, die nicht für Android geeignet ist. Im Fußball brauchen Sie mit 4 Kameras Quadrozessoren mit mindestens 3000Mhz. Ich rate, Matlab zu benutzen.

    
___ qstnhdr ___ Verfolgen Sie die Geschwindigkeit einer sich bewegenden Ansicht ___
Alexey Subbota 02.05.2017 13:09
quelle
0

Unter der Annahme, dass Sie nicht skalieren, ist die Geschwindigkeit einer Berührung die Menge, um die sich Ihr Finger bewegt hat, geteilt durch die Zeit. Die Zeit ist einfach zu bekommen - fordern Sie einfach die Systemzeit in Millisekunden bei jedem Ereignis an und subtrahieren Sie. Bei einer übersetzten Ansicht möchten Sie sicherstellen, dass Sie das gleiche Bezugssystem verwenden. Verfolgen Sie im Wesentlichen den X- und Y-Versatz der Ansicht, indem Sie sie verschieben, und fügen Sie den Versatz der Berührung hinzu, um den Gesamtversatz Ihres Fingers relativ zum Ursprung zu erhalten. Vergleichen Sie nur diese Zahlen für Ihre Geschwindigkeitsverfolgung.

Wenn Sie auch die Ansicht skalieren, wird es komplizierter. Sie müssen die gleiche Art von Mathe mit dem Skalierungsfaktor machen. Im Grunde übersetzt man alle Punkte in ein und dasselbe Referenzsystem.q

    
Gabe Sechan 04.07.2013 03:43
quelle
-1

Ich denke, Sie sprechen über die Kamerabewegung, als würden Sie einem Athleten in Echtzeit folgen. Wenn ja, gibt es nur einen Weg: Während der Erfassung der Bewegung benötigen Sie einen festen Punkt, wie einen Tennisball im Boden, um die Geschwindigkeit des statischen Balls zu "einem Gelenk" im Athleten zu subtrahieren. Dies ist notwendig, um die X-, Y-Koordinaten im Anfangs- und Endbild des statischen Objekts zu erhalten, um den Unterschied zum bewegten Objekt zu machen.

Bewegliches Objekt: Quadrat ((X Position End-X Position Anfangs) ^ 2 + (Y Position End-Y Position Initial) ^ 2) Dann wandeln Sie Pixel in Meter oder Meilen um dann dividiere das Ergebnis durch Sekunden (benötigt auch eine Umwandlung von Millisekunden) Sie erhalten km / h und mp / h für das bewegte Objekt.

Führen Sie alle Schritte für das statische Objekt aus. Subtrahiere das Ergebnis vom statischen Objekt auf das sich bewegende Objekt.

Das Gleiche gilt für Zoom-Operationen. Alle Operationen sind manuell. Wenn Sie die reale Geschwindigkeit in Echtzeit wollen, brauchen Sie eine automatische Verfolgung, die nicht für Android geeignet ist. Im Fußball brauchen Sie mit 4 Kameras Quadrozessoren mit mindestens 3000Mhz. Ich rate, Matlab zu benutzen.

    
João Hugo Cardoso 23.10.2013 01:06
quelle

Tags und Links