2014-10-19 19 views
5

Về cơ bản tôi đang cố gắng tạo hiệu ứng ngắn bằng cách sử dụng JavaFX. Tôi có hình dạng của một trái tim (được cộng lại với nhau từ hai vòng tròn và một đa giác) mà tôi có thể thay đổi về kích thước bằng cách sử dụng giá trị kép p. "Kích thước Standart" sẽ là p = 1.0;.Làm cho JavaFX chờ và tiếp tục với mã

Tôi đang cố gắng thêm hiệu ứng bơm vào tim. Tôi có phương pháp pumpOnce():

public void pumpOnce(){ 
    p = p + 1; 
    initHeart(); 
    //Here goes what ever it takes to make stuff working!! 
    p = p - 1; 
    initHeart(); 
} 

initHeart() thu hút trung tâm dựa trên p.

Tôi đã phát hiện ra rằng Thread.sleep(); hoặc các phương pháp tương tự sẽ không hoạt động do triết lý chuỗi trong JavaFX.

Nhưng tôi có thể sử dụng cái nào?

+0

Bạn có thể sử dụng 'PauseTransition' hoặc' Timeline' bằng 'KeyFrame' để tạo các chuyển tiếp hoạt ảnh phức tạp/tùy chỉnh hơn. –

+0

Vâng tôi đã nhìn thấy câu trả lời của bạn ở đâu đó quanh Uluk, nhưng tôi không thực sự cố gắng thực hiện một quá trình chuyển đổi, nhưng về cơ bản là một hoạt ảnh hai khung hình. Tôi có thể sử dụng 'Timeline' tương tự' Thread.sleep() 'không? – Maverick283

+1

Một 'PauseTransition' không phải được liên kết với một nút. Bạn chỉ cần tạo một cái, sử dụng trình xử lý 'setOnFinished' của nó để mã thực thi sau khi tạm dừng và gọi' play() 'để bắt đầu nó. –

Trả lời

10

Các hoạt ảnh JavaFX có thể là cách để đi, nhưng "triết lý chủ đề" trong JavaFX không khó để làm việc nếu bạn muốn cuộn của riêng bạn hoặc làm những thứ phức tạp hơn trong chủ đề nền.

Đoạn mã dưới đây sẽ dừng lại và thay đổi giá trị trong một nhãn (tiết lộ đầy đủ, tôi đang sử dụng lại mã tôi đã viết cho một câu hỏi khác):

import javafx.application.Application; 
import javafx.concurrent.Task; 
import javafx.concurrent.WorkerStateEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class HelloWorld extends Application { 

    private static Label label; 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle("Hello World!"); 
     label = new Label(); 
     label.setText("Waiting..."); 
     StackPane root = new StackPane(); 
     root.getChildren().add(label); 
     primaryStage.setScene(new Scene(root, 300, 250)); 
     primaryStage.show(); 

     Task<Void> sleeper = new Task<Void>() { 
      @Override 
      protected Void call() throws Exception { 
       try { 
        Thread.sleep(5000); 
       } catch (InterruptedException e) { 
       } 
       return null; 
      } 
     }; 
     sleeper.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 
      @Override 
      public void handle(WorkerStateEvent event) { 
       label.setText("Hello World"); 
      } 
     }); 
     new Thread(sleeper).start(); 
    } 
} 

Các công cụ cơ bản nền JavaFX là Task, bất kỳ JavaFX ứng dụng thực sự làm bất cứ điều gì có thể sẽ được rải rác với tất cả trên. Tìm hiểu cách sử dụng chúng.

3

Giải pháp của Dave rất tuyệt vời cho mục đích chung ngoài công việc dựa trên luồng trong JavaFX.

Nếu bạn muốn sử dụng các tiện ích hoạt hình của JavaFX, các giải pháp dưới đây sẽ chứng minh điều này bằng cách sử dụng một Dòng thời gian hoặc một ScaleTransition. Dòng thời gian thực hiện một tỷ lệ rời rạc của phần tử giao diện người dùng, do đó, mỗi phần tư giây phần tử giao diện người dùng được thu nhỏ lại hoặc trở lại kích thước ban đầu của nó. Việc chuyển đổi quy mô thực hiện một quy mô trơn tru của phần tử giao diện người dùng, do đó phần tử giao diện người dùng dần dần trở nên lớn hơn sau đó nhỏ hơn bằng cách sử dụng hệ số tỷ lệ nội suy với default easing interpolator.

import javafx.animation.*; 
import javafx.application.Application; 
import javafx.beans.property.*; 
import javafx.scene.Scene; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class BeatingHeart extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    public void start(Stage stage) { 
     ImageView heart = new ImageView(HEART_IMAGE_LOC); 

     animateUsingTimeline(heart); 
//  animateUsingScaleTransition(heart); 

     StackPane layout = new StackPane(heart); 
     layout.setPrefWidth(heart.getImage().getWidth() * 2); 
     layout.setPrefHeight(heart.getImage().getHeight() * 2); 

     Scene scene = new Scene(layout); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    private void animateUsingTimeline(ImageView heart) { 
     DoubleProperty scale = new SimpleDoubleProperty(1); 
     heart.scaleXProperty().bind(scale); 
     heart.scaleYProperty().bind(scale); 

     Timeline beat = new Timeline(
      new KeyFrame(Duration.ZERO,   event -> scale.setValue(1)), 
      new KeyFrame(Duration.seconds(0.5), event -> scale.setValue(1.1)) 
     ); 
     beat.setAutoReverse(true); 
     beat.setCycleCount(Timeline.INDEFINITE); 
     beat.play(); 
    } 

    private void animateUsingScaleTransition(ImageView heart) { 
     ScaleTransition scaleTransition = new ScaleTransition(
      Duration.seconds(1), heart 
     ); 
     scaleTransition.setFromX(1); 
     scaleTransition.setFromY(1); 
     scaleTransition.setFromZ(1); 
     scaleTransition.setToX(1.1); 
     scaleTransition.setToY(1.1); 
     scaleTransition.setToZ(1.1); 
     scaleTransition.setAutoReverse(true); 
     scaleTransition.setCycleCount(Animation.INDEFINITE); 
     scaleTransition.play(); 
    } 

    private static final String HEART_IMAGE_LOC = 
      "http://icons.iconarchive.com/icons/mirella-gabriele/valentine/128/Heart-red-icon.png"; 
    // icon obtained from: http://www.iconarchive.com/show/valentine-icons-by-mirella-gabriele/Heart-red-icon.html 
    // icon license: Free for non-commercial use, commercial use not allowed. 
} 
Các vấn đề liên quan