首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX ScaleTransition

JavaFX ScaleTransition
EN

Stack Overflow用户
提问于 2020-12-16 19:15:49
回答 1查看 220关注 0票数 0

嗨,伙计们,我正试图在我的游戏中添加一个卡片翻转动画,但是我得到了一些我不明白的例外情况,而且我没有一直得到它们--有时甚至会停止转换。在这里输入图像描述是我的转换代码。

代码语言:javascript
复制
public void transitionAnimation(ImageView imageView,Image image){
    ScaleTransition front = new ScaleTransition(Duration.seconds(0.15),imageView);
    ScaleTransition back = new ScaleTransition(Duration.seconds(0.15),imageView);

    front.setFromX(1);
    front.setToX(0);
    front.setCycleCount(1);
    front.play();

    back.setFromX(0);
    back.setToX(1);
    back.setCycleCount(1);
    back.setDelay(Duration.seconds(0.15));
    back.play();

    Timer timer = new Timer();
    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            imageView.setImage(image);
            timer.cancel();
            timer.purge();
        }
    };
    timer.schedule(timerTask,148);
}
代码语言:javascript
复制
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 180
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:359)
    at java.base/java.util.ArrayList.get(ArrayList.java:427)
    at javafx.graphics/javafx.scene.Parent.updateCachedBounds(Parent.java:1701)
    at javafx.graphics/javafx.scene.Parent.recomputeBounds(Parent.java:1645)
    at javafx.graphics/javafx.scene.Parent.doComputeGeomBounds(Parent.java:1498)
    at javafx.graphics/javafx.scene.Parent.access$200(Parent.java:79)
    at javafx.graphics/javafx.scene.Parent$1.doComputeGeomBounds(Parent.java:115)
    at javafx.graphics/com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(ParentHelper.java:84)
    at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBoundsImpl(RegionHelper.java:78)
    at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBounds(RegionHelper.java:62)
    at javafx.graphics/javafx.scene.layout.Region.doComputeGeomBounds(Region.java:3289)
    at javafx.graphics/javafx.scene.layout.Region.access$300(Region.java:147)
    at javafx.graphics/javafx.scene.layout.Region$1.doComputeGeomBounds(Region.java:168)
    at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.computeGeomBoundsImpl(RegionHelper.java:89)
    at javafx.graphics/com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:115)
    at javafx.graphics/javafx.scene.Node.updateGeomBounds(Node.java:3837)
    at javafx.graphics/javafx.scene.Node.getGeomBounds(Node.java:3799)
    at javafx.graphics/javafx.scene.Node.getLocalBounds(Node.java:3747)
    at javafx.graphics/javafx.scene.Node.updateTxBounds(Node.java:3901)
    at javafx.graphics/javafx.scene.Node.getTransformedBounds(Node.java:3693)
    at javafx.graphics/javafx.scene.Parent.getChildTransformedBounds(Parent.java:1845)
    at javafx.graphics/javafx.scene.Parent.recomputeBounds(Parent.java:1634)
    at javafx.graphics/javafx.scene.Parent.doComputeGeomBounds(Parent.java:1498)
    at javafx.graphics/javafx.scene.Parent.access$200(Parent.java:79)
    at javafx.graphics/javafx.scene.Parent$1.doComputeGeomBounds(Parent.java:115)
    at javafx.graphics/com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(ParentHelper.java:84)
    at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBoundsImpl(RegionHelper.java:78)
    at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBounds(RegionHelper.java:62)
    at javafx.graphics/javafx.scene.layout.Region.doComputeGeomBounds(Region.java:3289)
    at javafx.graphics/javafx.scene.layout.Region.access$300(Region.java:147)
    at javafx.graphics/javafx.scene.layout.Region$1.doComputeGeomBounds(Region.java:168)
    at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.computeGeomBoundsImpl(RegionHelper.java:89)
    at javafx.graphics/com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:115)
    at javafx.graphics/javafx.scene.Node.updateGeomBounds(Node.java:3837)
    at javafx.graphics/javafx.scene.Node.getGeomBounds(Node.java:3799)
    at javafx.graphics/javafx.scene.Node.getLocalBounds(Node.java:3747)
    at javafx.graphics/javafx.scene.Node.intersectsBounds(Node.java:5282)
    at javafx.graphics/javafx.scene.Node$1.intersectsBounds(Node.java:548)
    at javafx.graphics/com.sun.javafx.scene.NodeHelper.intersectsBounds(NodeHelper.java:262)
    at javafx.graphics/javafx.scene.layout.Region.doPickNodeLocal(Region.java:3158)
    at javafx.graphics/javafx.scene.layout.Region.access$600(Region.java:147)
    at javafx.graphics/javafx.scene.layout.Region$1.doPickNodeLocal(Region.java:184)
    at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.pickNodeLocalImpl(RegionHelper.java:104)
    at javafx.graphics/com.sun.javafx.scene.NodeHelper.pickNodeLocal(NodeHelper.java:128)
    at javafx.graphics/javafx.scene.Node.pickNode(Node.java:5192)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.pickNode(Scene.java:3993)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1300(Scene.java:3579)
    at javafx.graphics/javafx.scene.Scene.pick(Scene.java:2029)
    at javafx.graphics/javafx.scene.Scene.access$6800(Scene.java:172)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3805)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1200(Scene.java:3579)
    at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1849)
    at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2588)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:397)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:434)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:390)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:433)
    at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)
    at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:832)

Process finished with exit code 0
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-16 19:27:17

您的TimerTask在后台线程上运行,并从该线程更新ImageView。因为与大多数UI工具包一样,JavaFX是单线程的,所以这里的行为是未定的;您将看到多个线程之间数据不一致的影响。

只需使用动画API专门管理像这样的功能;例如使用SequentialTransition

代码语言:javascript
复制
public void transitionAnimation(ImageView imageView,Image image){
    ScaleTransition front = new ScaleTransition(Duration.seconds(0.15),imageView);
    ScaleTransition back = new ScaleTransition(Duration.seconds(0.15),imageView);

    front.setFromX(1);
    front.setToX(0);
    front.setCycleCount(1);

    front.setOnFinished(e -> imageView.setImage(image));

    back.setFromX(0);
    back.setToX(1);
    back.setCycleCount(1);

    new SequentialTransition(front, back).play();

}

或者是Timeline

代码语言:javascript
复制
public void transitionAnimation(ImageView imageView,Image image){

    KeyFrame start = new KeyFrame(Duration.ZERO, new KeyValue(imageView.scaleXProperty(), 1.0));
    KeyFrame middle = new KeyFrame(
        Duration.millis(150),
        e -> imageView.setImage(image),
        new KeyValue(imageView.scaleXProperty(), 0.0)
    );
    KeyFrame end = new KeyFrame(Duration.millis(300), new KeyValue(imageView.scaleXProperty(), 1.0));
    new Timeline(start, middle, end).play();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65329750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档