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:
In Fragment
, wo ich drag & amp; drop verwende, habe ich zwei Listener erstellt, um ein Ziehereignis für ein View
:
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.
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.
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.
Tags und Links android drag-and-drop