Ich verschiebe mit Timeline eine ImageView um 10 Pixel. Das funktioniert und wird am Bildschirm korrekt angezeigt. Sehe ich mir nachher die Position des ImageView an (.getY()) so steht dort aber immer noch die ursprüngliche Position die nun aber falsch ist. Wie komme ich zu einer richtigen Position des ImageView?
Ich habe ein setOnFinished EventHandler und dort sind die Werte noch die Alten.
Auch wenn ich mir später (auf Klick) die Position ansehe ist sie noch die Alte obwohl sie am Schirm auf der richtigen Position steht.
Aber ich werde das probieren, Danke
Es wäre wichtig, dass wir genaue Informationen bekommen, was getan wird.
Wenn Du ein setY aufrufst, dann wird ein nachfolgendes getY den neuen Wert zurück geben. Mögliche Probleme kommen nur, wenn Veränderungen asynchron ablaufen:
Du rufst irgendwas auf. Dies triggert ein Event und im Rahmen des Eventhandlings ändert sich dann etwas
Da im weiteren Code das Event noch nicht behandelt wurde, gibt es die Änderungen noch nicht
irgendwann später wird dann das Event bearbeitet. Dann erst ändern sich die Werte,
Das aber nur als einfache Bescheibung worum in in dem anderen Thread ging. Was bei Dir ggf. falsch läuft können wir aber nur sagen, wenn wir den Code sehen. (Ideal ist immer etwas das auch übersetzt und das man selbst ausführen kann zum testen!)
The node's final translation will be computed as layoutX + translateX, where layoutX establishes the node's stable position and translateX optionally makes dynamic adjustments to that position.
This variable can be used to alter the location of a node without disturbing its layoutBounds, which makes it useful for animating a node's location.
==> Wenn Du also die layoutBounds auswertest (die layoutX Position), dann ist diese nicht verändert.
b) Wenn Du die richtige Abfrage gemacht haben solltest, dann kann natürlich das Problem auch sein, dass du die Variablen nur einmal setzt und danach nie wieder.
Generell kannst Du die Position einer Komponente in der Scene bekommen per: Bounds boundsInScene = node.localToScene(node.getBoundsInLocal());
Ok, dann dürfte a) das Problem sein. Hier evtl. noch kurz zu dem Verständnis:
Du hast Elemente (Nodes), welche eine gewisse Position/Größe u.s.w. haben. Dies wird einmal festgelegt.
Zur Anzeige wird dies aber weiter angepasst. Das sind dann unter dem Strich Transforms, die dann das Element verschieben, drehen, skalieren, ....
Was Du also da hast ist erst einmal nur die reine Basis-Angabe. Die Anpassungen machst Du ja über die Transformierung. Damit ändert sich nicht die Basis-Angabe sondern nur die Darstellung. Wenn Du jetzt wissen willst, wo der Node dargestellt wird, dann musst Du dies auch verarbeiten. getBoundsInLocal wäre da die erste Methode. Das ganze will man dann aber noch in einem einheitlichen Koordinatensystem haben, also z.B. in der Scene, daher vermutlich noch ein localToScene Aufruf.
Wenn Du jetzt wissen willst, wo der Node dargestellt wird, dann musst Du dies auch verarbeiten. getBoundsInLocal wäre da die erste Methode. Das ganze will man dann aber noch in einem einheitlichen Koordinatensystem haben, also z.B. in der Scene, daher vermutlich noch ein localToScene Aufruf.
Da verstehe ich gerade nicht, was Du genau versuchst. Es geht doch nur um die Bestimmung der Position. Also setzt Du keine Position.
Und die Werte solltest Du in boundsInScene haben. Da Du nur das imgV verschiebst kannst Du auch mit dem localToScene Aufruf feststellen, um wieviel es verschoben wurde und du könntest dann die effektiven x und y Koordinaten berechnen.
Aber diese darfst Du natürlich nicht setzen, denn dann würdest Du es natürlich erneut verschieben.
Sprich: Berechne mit imgV.getX() + value.getX() die effektie X-Koordinate aber setze diese nicht!
Wenn ich die Position nach der Animation nicht setze, dann wird bei einer Wiederholung der Animation wieder auf der Ursprungsposition begonnen. Beispiel: Start Animation 1 300/250 Bewegung -10 Pixel Y. Die Animation ist ok. Start Animation 2 wieder bei 300/250. Also muss ich irgendwie die Position um den Animationsfaktor anpassen.
Ich habe das Problem nun in einer kleinen fertigen App dargestellt. Da sieht man deutlich, dass das Aufeinanderfolgen von Bewegungen nicht stimmt. Allerdings weiß ich nicht warum!
Noch einmal die Grundlagen, die ich schon einmal versucht habe, zu erläutern:
a) So ein Node hat eine Position im übergeordneten Element. Diese kannst Du mit x / y holen/setzen (also getX, setX, getY, setY)
b) Bei der Anzeige wird das Element aber ggf. noch verschoben. Dazu dienen translateXProperty / translateYProperty.
Diese nutzt Du bei deiner Bewegung. Denn da gibst Du vor, wie etwas verschoben werden soll. Dein Rechteck ist also auf 300, 200, translate x/y ist 0 / 0 --> Rechteck wird bei 300,200 angezeigt.
Nun kommt der erste Klick -> translateX soll auf 10 gehen, translateY soll auf 0 gehen (in der Animation)
==> Das Rechteck wandert nun in der Animation auf 310, 200
Nun kommt der andere Klick -> TranslateX soll wieder auf 0 gehen, translateY soll auf 10 gehen (in der Animation)
==> Das Rechteck wandert nun nach links unten.
Nehmen wir die Problematik, die Du beschrieben hattest:
Das Kästchen wandert von 300,200 nach 310,200 (position ist 300,200 aber translateX ist 10).
Wenn translateX auf 10 ist und Du die Position auf die Dargestellte Position umsetzten, dann hast Du Position bei 310,200 und dargestellt wird das Kästchen durch die translateX 10 bei 320,200
==> Da macht das Kästchen dann einen Sprung.
Was kannst Du jetzt machen?
a) Du kannst die Position jedes Mal neu setzen. Dazu musst Du dann aber nicht nur die Position setzen sondern auch das translateX auf 0 setzen. Also etwas wie:
a) Du kannst die Position jedes Mal neu setzen. Dazu musst Du dann aber nicht nur die Position setzen sondern auch das translateX auf 0 setzen. Also etwas wie: