Legen Sie einen benutzerdefinierten Anker fest, wenn Sie eine Ansicht ziehen

7

Ich benutze Android Drag & amp; Drop API und versuche, den Anker des Drag Shadow an den Punkt zu setzen, wo die Berührung in View gemacht wurde. Das Standardverhalten besteht darin, den Anker in der Mitte von View zu haben.

Ich habe etwas recherchiert und es scheint, dass dies durch Überschreiben der onProvideShadowMetrics (Point shadowSize, Point shadowTouchPoint) Methode in der DragShadowBuilder -Klasse. Soweit ich das verstanden habe, sollte ich, wenn ich die x, y Koordinaten von shadowTouchPoint ändere, die Koordinaten des Schleppankers ändern.

Was ich getan habe, war die DragShadowBuilder -Klasse wie folgt zu erweitern:

%Vor%

In Fragment , wo ich drag & amp; drop verwende, habe ich zwei Listener erstellt, um ein Ziehereignis für ein View :

zu starten %Vor%

Und ich setze die Werbeleiter:

%Vor%

Alles in Ordnung bis hier. Aber wenn ich die App teste und den Ziehprozess beginne, wird der Ziehschatten unter dem Berührungspunkt zentriert. So verwendet es das Standardverhalten. Ich habe versucht, zu debuggen und ich sehe, dass mEventTouchXCoord und mEventTouchYCoord richtig eingestellt sind. Die Methode shadowTouchPoint.set(touchPointXCoord, touchPointYCoord); erhält die richtigen Koordinaten, zentriert aber immer noch den Schatten.

Ich weiß nicht, was ich falsch mache. Vielleicht habe ich die API missverstanden. Jede Hilfe mit oder Hinweis würde sehr geschätzt werden.

    
Bandreid 17.03.2014, 15:22
quelle

2 Antworten

11

Ok, so wie Scoup sagte, dass das Problem in der onProvideShadowMetrics() -Methode lag. Tatsache ist, wenn ich den Superkonstruktor super.onProvideShadowMetrics(shadowSize, shadowTouchPoint); entferne, wird der Schleppschatten nicht mehr angezeigt.

Bei genauerer Betrachtung der API-Methode habe ich Folgendes gefunden:

%Vor%

In der Tat setzt es die shadowTouchPoint auf die Mitte der gezogenen View zurück. Aber es initialisiert auch den Ziehschatten auf die richtigen Dimensionen. Während ich möchte, dass die Drag Shadow-Dimensionen korrekt eingestellt sind, möchte ich shadowTouchPoint nicht zurücksetzen.

Dies erreichen Sie am einfachsten, indem Sie den Superkonstruktor vor aufrufen, um% ce_de% mit den benutzerdefinierten Werten zu initialisieren:

%Vor%

Eine andere Lösung besteht darin, sich mit dem Dragschatten shadowTouchPoint selbst zu befassen und den Superkonstruktor ganz zu überspringen. Ich werde mit einem detaillierten Update zurückkommen.

    
Bandreid 26.03.2014, 12:38
quelle
7

Ich denke, das Problem ist diese Zeile super.onProvideShadowMetrics(shadowSize, shadowTouchPoint);

Sie haben den Wert von shadowTouchPoint bereits in shadowTouchPoint.set(touchPointXCoord, touchPointYCoord); geändert, aber wenn Sie super aufrufen, übergeben Sie den shadowTouchPoint, der durch die Standardmethode "super" ersetzt wird, und das Standardverhalten ist center the shadowTouchPoint.

Entfernen Sie einfach diese Zeile.

    
Scoup 26.03.2014 02:01
quelle

Tags und Links