2014-10-19 9 views
5

के साथ जारी रखें मूल रूप से मैं JavaFX का उपयोग करके एक छोटा प्रभाव बनाने की कोशिश कर रहा हूं। मेरे पास दिल का आकार है (दो मंडलियों और बहुभुज से एक साथ जोड़ा गया है) कि मैं डबल मान p का उपयोग करके आकार में भिन्न हो सकता हूं। "स्टैंडअर्ट साइज" p = 1.0; होगा।जावाएफएक्स को प्रतीक्षा करें और कोड

मैं दिल में एक पंपिंग प्रभाव जोड़ने की कोशिश कर रहा हूं।

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

initHeart()p के आधार पर दिल खींचता है: मैं विधि pumpOnce() है।

मुझे पता चला है कि Thread.sleep(); या इसी तरह के तरीके JavaFX में थ्रेड दर्शन के कारण काम नहीं करेंगे।

लेकिन मैं इसके बजाय क्या उपयोग कर सकता हूं?

+0

आप अधिक जटिल/कस्टम एनीमेशन संक्रमण बनाने के लिए 'कुंजीफ्रेम' के साथ 'रोकथाम' या 'टाइमलाइन' का उपयोग कर सकते हैं। –

+0

हाँ मैंने उलुक के आसपास कहीं तुम्हारा जवाब देखा, फिर भी मैं वास्तव में एक संक्रमण करने की कोशिश नहीं कर रहा हूं, लेकिन मूल रूप से एक दो फ्रेम एनीमेशन। क्या मैं 'थ्रेडलाइन' (थ्रेड.sleep() 'के समान 'टाइमलाइन' का उपयोग कर सकता हूं? – Maverick283

+1

ए 'पॉज़ ट्रांसिशन' को नोड से संबद्ध नहीं होना चाहिए। आप केवल एक बना सकते हैं, रोक के बाद निष्पादित करने के लिए कोड के लिए 'setOnFinished' हैंडलर का उपयोग करें, और इसे शुरू करने के लिए 'play()' पर कॉल करें। –

उत्तर

10

जावाएफएक्स एनिमेशन शायद जाने का तरीका है, लेकिन जावाएफएक्स में "थ्रेड दर्शन" के साथ काम करना मुश्किल नहीं है यदि आप अपना खुद का रोल करना चाहते हैं, या पृष्ठभूमि धागे में अन्य जटिल चीजें करना चाहते हैं।

निम्नलिखित कोड को रोकते हैं और एक लेबल का मान बदलें (पूर्ण प्रकटीकरण, मैं कोड मैं एक और सवाल के लिए लिखा था पुन: उपयोग कर रहा हूँ) होगा:

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(); 
    } 
} 

बुनियादी JavaFX पृष्ठभूमि उपकरण टास्क, किसी भी JavaFX है वास्तव में कुछ भी करने वाला एप्लिकेशन शायद इन सबके साथ बिखरा हुआ होगा। जानें कि उनका उपयोग कैसे करें।

3

डेव का समाधान जावाफैक्स में थ्रेड आधारित काम से सामान्य उद्देश्य के लिए बहुत अच्छा है।

यदि आप जावाएफएक्स की एनीमेशन सुविधाओं का उपयोग करना चाहते हैं, तो नीचे दिए गए समाधान टाइमलाइन या स्केल ट्रान्सशन का उपयोग करके इसका प्रदर्शन करते हैं। टाइमलाइन यूआई तत्व के एक अलग पैमाने को लागू करती है, इसलिए यूआई तत्व के दूसरे भाग की प्रत्येक तिमाही को बड़े आकार में या उसके मूल आकार में स्केल किया जाता है। स्केल संक्रमण यूआई तत्व के एक चिकनी पैमाने को लागू करता है, इसलिए यूआई तत्व 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. 
} 
संबंधित मुद्दे