2015-05-09 4 views
0

Я использую TranslateTransition для перемещения ImageView из центра в центр окна сцены. В этом и заключается проблема: анимация прыгает. Движение ImageView не является гладким и линейным. Я попытался включить свойства -Dcom.sun.scenario.animation.vsync=true, -Dcom.sun.scenario.animation.adaptivepulse=true, но безуспешно. Думая, что проблемы могут быть вызваны мощностью компьютера, я запускаю приложение более мощным и разным ПК (I7 с 16 ГБ оперативной памяти), но без успеха анимация негладкая. Я читал, что таймер JavaFX автоматически вычисляет импульс в соответствии с экраном hz. Так вы можете помочь мне разобраться, почему анимация негладкая?Не плавный перевод

MVCE:

import java.io.File; 

import javafx.animation.Animation; 
import javafx.animation.Interpolator; 
import javafx.animation.PauseTransition; 
import javafx.animation.SequentialTransition; 
import javafx.animation.TranslateTransition; 
import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.AnchorPane; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class MCVE extends Application 
{ 
    private Stage stage; 
    private String title = null; 

    public static void main(String[] args) 
    { 
     Application.launch(MCVE.class, new java.lang.String[] { "--filename=./template.fxml" }); 
    } 

    public MCVE() 
    { 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception 
    { 
     stage = primaryStage; 

     final Parameters params = getParameters(); 

     // load fxml 
     final AnchorPane page = (AnchorPane) FXMLLoader.load(new File(params.getNamed().get("filename")).toURI().toURL()); 
     Scene scene = new Scene(page); 

     // setup stage 
     stage.setScene(scene); 
     stage.setMinWidth(page.getPrefWidth()); 
     stage.setMinHeight(page.getPrefHeight()); 
     stage.setWidth(page.getPrefWidth()); 
     stage.setHeight(page.getPrefHeight()); 

     stage.setTitle(title); 

     // setup full screen mode 
     EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() 
     { 
      @Override 
      public void handle(MouseEvent mouseEvent) 
      { 
       if (mouseEvent.getClickCount() >= 2) 
       { 
        stage.setFullScreen(!stage.isFullScreen()); 
       } 
      } 
     }; 
     scene.setOnMouseClicked(mouseHandler); 

     // setup scene 
     setupScene(); 

     // open the stage 
     stage.show(); 
    } 

    /** 
    * @param nodeName 
    * @return 
    */ 
    private Node getNode(String nodeName) 
    { 
     return stage.getScene().lookup("#" + nodeName.toLowerCase()); 
    } 

    /** 
    * 
    */ 
    private void setupScene() 
    { 
     String userdir = System.getProperty("user.dir"); 

     // slide node 
     final Node node = getNode("image"); 

     long inTime = 5000; 
     long pauseTime = 3000; 
     long outTime = 5000; 

     TranslateTransition in = new TranslateTransition(Duration.millis(inTime)); 
     in.setFromX(-1280); 
     in.setToX(node.translateXProperty().getValue()); 
     in.setInterpolator(Interpolator.EASE_IN); 

     PauseTransition pause = new PauseTransition(Duration.millis(pauseTime)); 

     TranslateTransition out = new TranslateTransition(Duration.millis(outTime)); 
     out.setFromX(node.translateXProperty().getValue()); 
     out.setInterpolator(Interpolator.EASE_OUT); 
     out.setToX(1280 + node.getBoundsInLocal().getWidth()); 

     final SequentialTransition timeline = new SequentialTransition(node, in, pause, out); 
     timeline.setCycleCount(Animation.INDEFINITE); 
     timeline.play(); 

    } 

} 

Here загрузить необходимые ресурсы. Сохраните их в рабочей папке.

Это дамп с = -Dprism.verbose верно

Prism pipeline init order: d3d sw 
Using platform text rasterizer 
Using native-based Pisces rasterizer 
Using dirty region optimizations 
Not using texture mask for primitives 
Not forcing power of 2 sizes for textures 
Using hardware CLAMP_TO_ZERO mode 
Opting in for HiDPI pixel scaling 
Prism pipeline name = com.sun.prism.d3d.D3DPipeline 
Loading D3D native library ...succeeded. 
D3DPipelineManager: Created D3D9Ex device 
Direct3D initialization succeeded 
(X) Got class = class com.sun.prism.d3d.D3DPipeline 
Initialized prism pipeline: com.sun.prism.d3d.D3DPipeline 
OS Information: 
Windows 7 build 7601 
D3D Driver Information: 
ATI Mobility Radeon HD 4650 
\\.\DISPLAY1 
Maximum supported texture size: 8192 
Maximum texture size clamped to 4096 
Driver atiumd64.dll, version 8.14.10.678 
Pixel Shader version 3.0 
Device : ven_1002, dev_9480, subsys_02051025 
Max Multisamples supported: 4 

Cheers, Фабио

+2

Можете ли вы создать [MCVE] (http://stackoverflow.com/help/mcve), который демонстрирует проблему? –

+0

@James_D над кодом, который я использую для создания узла временной шкалы. –

+0

Создайте MCVE –

ответ

1

Попробуйте установить кэш и cacheHint на узел (изображение) для плавной анимации, т.е.

node.setCache(true); 
node.setCacheHint(CacheHint.SPEED); 

Проверьте JavaFX 8 Node для получения дополнительной информации