2017-12-17 9 views
-1

Ich habe eine LinearLayout, die fünf Ansichten innerhalb hat, sie bilden ein 1x5-Raster.Wie wird das gezogene Objekt auf den Ursprung des Ziehens ausgerichtet?

Dieses LinearLayout wird gezogen.

Ich setze gerade die Einstellung onTouchListeners auf jede der fünf Ansichten, überprüfe, von welchen der fünf der Widerstand stammt und motionEvent.getAction() auf der LinearLayout aufrufen.

Dies ist nicht perfekt, weil das LinearLayout durch seine Mitte gezogen wird und nicht durch den Startpunkt des Ziehens.

Gibt es eine Möglichkeit, das LinearLayout am Anfang von motionEvent zu transformieren, sodass die Ansicht, aus der der Ziehvorgang stammt, unter dem Finger liegt, während Sie ziehen?

MyTouchListener, die auf jedem der fünf Ansichten innerhalb Linearlayout

private final class MyTouchListener implements View.OnTouchListener { 
    //public boolean onTouch(View view, MotionEvent motionEvent) { 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     LinearLayout ship = (LinearLayout)view.getParent(); 
     dragCellIndex = ship.indexOfChild(view); 
     dragCellTotal = ship.getChildCount(); 
     view = ship; 

     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {    
      ClipData data = ClipData.newPlainText("", ""); 
      View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 
      view.startDrag(data, shadowBuilder, view, 0); 
      view.setVisibility(View.INVISIBLE); 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 
+0

hast du etwas versucht? Write einige Codes? –

+0

Ich habe den Touch-Listener hinzugefügt, den ich zum ursprünglichen Beitrag verwende. Ich habe versucht zu überprüfen, wie viele Zellen in der LinearLayout links und rechts von Drag-Ursprung und für jeden auf der linken SetTranslationX (cell.length() * - 1) und auf der rechten Seite setTranslationX (cell.length()). Das hat nichts geändert. –

Antwort

1

Um dies zu tun gesetzt ist, dann würden Sie ein wenig mathematische Berechnungen machen möchte. Rufen Sie die Berührung Ihrer Finger/Ziehen von X- und Y-Koordinaten aus dem motionEvent ab, berechnen Sie deren Unterschied mit den X- und Y-Koordinaten der oberen linken Ecke Ihres LinearLayout und speichern Sie sie in 2 Variablen.

Auf diese Weise fügen Sie beim Ziehen des LinearLayouts einfach diese Variablen den X- und Y-Koordinaten hinzu und verschieben das LinearLayout an diesen Punkt. Ich hoffe du hast die Idee.

Ich habe diese Methode bei der Entwicklung von Kartenspielen verwendet, funktioniert wie Charme.

+0

Meinst du, ich sollte die X- und Y-Koordinaten zum LinearLayout hinzufügen, wenn sie fallen gelassen werden oder direkt nach dem Aufruf von motionEvent()? –

+0

Die Idee ist - bei der ersten Berührung (ACTION_DOWN) erhalten Sie die X- und Y-Koordinaten aus dem motionEvent in Ihrem onTouchEvent (MotionEvent motionEvent) mit den Methoden getX() und getY(). Sie berechnen die Entfernung (Differenz zwischen den entsprechenden Koordinaten) mit dem LinearLayout X und Y, speichern Sie es in einigen Variablen. In ACTION_MOVE verwenden Sie dann diese Variablen, um die Bewegung des LinearLayouts durch Hinzufügen der gespeicherten Koordinaten anzupassen. –

Verwandte Themen