2017-11-11 3 views
0

Ich habe this Frage gefunden, aber es ist für iOS-Entwicklung. Ich mache etwas in Android, also war es keine Hilfe.Wie verschiebt man ein Objekt auf einer SurfaceView, ohne das Objekt selbst zu berühren?

Ich habe ein einfaches weißes Rechteck auf einer schwarzen Leinwand, und ich habe ein onTouchEvent eingerichtet. Ich kann das Rechteck wie erwartet verschieben, aber das ist nicht die Funktionalität, nach der ich suche.

Ich muss wissen, wie ich irgendwo auf dem Bildschirm berühren und ein Objekt bewegen kann? Ich will nicht, dass die X und Y des Objekts die getX() und getY() meiner Berührungsereignisse werden.

Vorerst habe ich:

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    switch(event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
     case MotionEvent.ACTION_MOVE: 
      myPoint.set((int)event.getX(), (int)event.getY()); 
    } 
    return true; 
} 

für diese Meine Argumentation ist so kann das Objekt ohne einen Finger schwebt über ihm zu sehen. Ist das möglich?

Hier ist eine visuelle Darstellung von dem, was ich will erreichen:

onTouch example

Antwort

1

Warum nicht erhalten und speichert die vorherigen Motionkoordinaten im onTouchEvent Rückruf, dann, wenn onTouchEvent Feuer wieder (erste ACTION_MOVE nach ACTION_DOWN und so weiter für jeden ACTION_MOVE-Callback) Berechnen Sie den Offset/Unterschied zwischen den Werten, erhalten Sie dann Ihre eigenen myPoint-Koordinaten und fügen Sie den Offset zu ihren aktuellen Werten hinzu. Auf diese Weise verschieben Sie das myPoint-Objekt nur um den Positionsoffset, nicht die tatsächlichen Koordinaten.

Dieser Code ist nicht getestet und ich habe nicht eine IDE, aber etwas so benutzten:

private float oldX; 
private float oldY; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      oldX = event.getX(); 
      oldY = event.getY(); 
      break; 

     case MotionEvent.ACTION_MOVE: 
      float newX = event.getX(); 
      float newY = event.getY(); 
      float offsetX = getOffset(oldX, newX, myPoint.x); 
      float offsetY = getOffset(oldY, newY, myPoint.y); 

      myPoint.set((int) offsetX, (int) offsetY); 

      oldX = newX; 
      oldY = newY; 
      break; 
    } 
    return true; 
} 

private float getOffset(float oldVal, float newVal, float current) { 
    return current + (newVal - oldVal); 
} 
+0

Ich arbeitete an diesem, aber Sie schlugen mich darauf. Es funktioniert irgendwie. Mein Rechteck verläuft nur diagonal von oben links nach unten rechts. Lol. Aber es ist Fortschritt! – IRGeekSauce

+0

Ok, ich habe ein paar Änderungen vorgenommen. In den Deklarationen offsetX und offsetY habe ich myPoint.x und myPoint.y ausgeführt. Es klappt. Ich werde deine Antwort gerne annehmen. – IRGeekSauce

+0

@IRGeekSauce ok, froh, dass es funktioniert wie gewünscht (Sie könnten immer die Antwort mit Ihrer aktualisierten Lösung bearbeiten, nur für die Fertigstellung). –

Verwandte Themen