Δημιουργία και Τροποποίηση Προσαρμοσμένων Συμπεριφορών Κίνησης σε JavaScript

Επισκόπηση

Οι προσαρμοσμένες συμπεριφορές κίνησης σάς επιτρέπουν να ελέγχετε μεμονωμένες λειτουργίες μέσα σε ένα εφέ κίνησης, όπως η αλλαγή χρώματος, η περιστροφή ενός σχήματος ή η ακολουθία επεξεργάσιμης διαδρομής κίνησης. Αυτός ο οδηγός δείχνει πώς να δημιουργήσετε και να συνδυάσετε συμπεριφορές, να ρυθμίσετε το χρόνο τους, να επιθεωρήσετε και να τροποποιήσετε υπάρχουσες κινήσεις και να επαληθεύσετε ότι οι ιδιότητές τους παραμένουν μετά την αποθήκευση και το άνοιγμα ξανά μιας παρουσίασης.

Για προεπιλεγμένα εφέ και ενεργοποιητές κλικ, δείτε Κίνηση Σχήματος.

Κατανόηση του Μοντέλου Κίνησης

Μία κίνηση οργανώνεται ως Γραμμή Χρόνου → Ακολουθία → Εφέ → Συμπεριφορές:

  • Η μέθοδος getTimeline επιστρέφει τη γραμμή χρόνου της διαφάνειας, η οποία περιλαμβάνει την κύρια ακολουθία της και τις διαδραστικές ακολουθίες.
  • Μια Sequence περιέχει εφέ, ενδέχεται στοχεύοντας σε διαφορετικά σχήματα.
  • Ένα Effect προσδιορίζει ένα σχήμα στόχο, προεγκατεστημένο εφέ, υποτύπο και χρόνο εφέ.
  • Η συλλογή που επιστρέφεται από το Effect.getBehaviors περιέχει τις λειτουργίες που εφαρμόζουν το εφέ: αλλαγή χρώματος, κίνηση, περιστροφή, ορισμό ιδιότητας κ.λπ.

Δημιουργία Μεμονωμένων Συμπεριφορών

Καλείτε το Sequence.addEffect για να δημιουργήσετε ένα εφέ και να έχετε πρόσβαση στη συλλογή getBehaviors. Ένα προεπιλεγμένο εφέ μπορεί να γεμίσει αυτή τη συλλογή αυτόματα. Διατηρήστε τις λειτουργίες του όταν επεκτείνετε το προεπιλεγμένο εφέ, ή χρησιμοποιήστε το clear όταν το αντικαθιστάτε σκόπιμα.

Η BehaviorFactory δημιουργεί τους οκτώ τύπους συμπεριφορών που απεικονίζονται παρακάτω. Η κίνηση καλύπτεται στην ενότητα Δημιουργία Διαδρομής Κίνησης. Κάθε απόσπασμα κώδικα περιλαμβάνει τις εισαγωγές των μονάδων του και μπορεί να εκτελεστεί ως σενάριο Node.js με τα πακέτα aspose.slides.via.java και java εγκατεστημένα. Εκτελέστε τα παραδείγματα δημιουργίας αρχείων πριν από τα παραδείγματα που διαβάζουν το αποτέλεσμα τους. Τα παραδείγματα επεξεργασίας που ακολουθούν αναφέρουν ποιο αρχείο εξόδου χρησιμοποιούν.

Περιστροφή

Χρησιμοποιήστε το createRotationEffect για να δημιουργήσετε μια περιστροφή. Το getBy καθορίζει μια σχετική γωνία σε μοίρες· τα getFrom και getTo καθορίζουν τα άκρα.

Το παράδειγμα ξεκινά με ένα εφέ Spin, αντικαθιστά τις προεγκατεστημένες λειτουργίες του με μία συμπεριφορά περιστροφής και δίνει σε αυτή τη λειτουργία διάρκεια δύο δευτερολέπτων. Μία σχετική γωνία 90 μοιρών εκφράζει μια τεταρτημόρροια περιστροφή από την αρχική προσανατολισμό του σχήματος, επομένως δεν απαιτείται ρητή αρχική γωνία.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);

    const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.Spin, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
    effect.getBehaviors().clear();

    const factory = new aspose.slides.BehaviorFactory();
    const rotation = factory.createRotationEffect();
    rotation.setBy(90);
    rotation.getTiming().setDuration(2);

    effect.getBehaviors().add(rotation);

    presentation.save("rotation.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

rotation.pptx περιέχει ένα σχήμα και μια συμπεριφορά περιστροφής. Η συλλογή, ο χρόνος και τα παραδείγματα επεξεργασίας περιστροφής παρακάτω χρησιμοποιούν αυτό το αρχείο.

Κλιμάκωση

Χρησιμοποιήστε το createScaleEffect με ποσοστά X/Y: τα getFrom και getTo περιγράφουν το αρχικό και τελικό μέγεθος, ενώ το getBy περιγράφει μια σχετική αλλαγή. Εδώ, το 100 σημαίνει το αρχικό μέγεθος.

Το παράδειγμα αυξάνει και τις δύο διαστάσεις από 100% σε 125% σε δύο δευτερόλεπτα. Η χρήση ίσων οριζόντιων και κατακόρυφων ποσοστών διατηρεί τις αναλογίες του σχήματος· διαφορετικά ποσοστά θα τράβηξαν τη μία διάσταση περισσότερο από την άλλη.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);

    const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.GrowShrink, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
    effect.getBehaviors().clear();

    const factory = new aspose.slides.BehaviorFactory();
    const scale = factory.createScaleEffect();
    scale.setFrom(java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(100), java.newFloat(100)));
    scale.setTo(java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(125), java.newFloat(125)));
    scale.getTiming().setDuration(2);

    effect.getBehaviors().add(scale);

    presentation.save("scale.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Χρώμα

Χρησιμοποιήστε το createColorEffect για να αλλάξετε τη γέμιση από μπλε σε πορτοκαλί. Τα getFrom και getTo είναι χρώματα· το getBy είναι μια μετατόπιση χρώματος. Το Behavior.getProperties προσδιορίζει το χαρακτηριστικό που ανιματίζεται.

Η στήριξη γεμίσματος του σ.shapeμάτος αρχικοποιείται σε μπλε, ταιριάζοντας με το αρχικό χρώμα της κίνησης. Η επιλογή του χαρακτηριστικού fill-color λέει στη συμπεριφορά ποιο τμήμα του σχήματος να αλλάξει· τα άκρα χρώματος από μόνα τους δεν προσδιορίζουν αυτό το χαρακτηριστικό. Το αποθηκευμένο εφέ περιγράφει μια δις δευτερολέπτων μετάβαση στο πορτοκαλί.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);
    shape.getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
    shape.getFillFormat().getSolidFillColor().setColor(java.getStaticFieldValue("java.awt.Color", "BLUE"));

    const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.ChangeFillColor, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
    effect.getBehaviors().clear();

    const factory = new aspose.slides.BehaviorFactory();
    const color = factory.createColorEffect();
    color.getProperties().add(aspose.slides.BehaviorProperty.getFillColor().getValue());
    color.getFrom().setColor(java.getStaticFieldValue("java.awt.Color", "BLUE"));
    const orange = java.newInstanceSync("java.awt.Color", 255, 165, 0);
    color.getTo().setColor(orange);
    color.getTiming().setDuration(2);

    effect.getBehaviors().add(color);

    presentation.save("color.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Φίλτρο

Χρησιμοποιήστε το createFilterEffect για να επιλέξετε ένα ξέσαμα. Τα getType, getSubtype και getReveal καθορίζουν το φίλτρο, την κατεύθυνση και το αν θα αποκαλυφθεί ή θα κρυφτεί το σχήμα.

Αυτό το παράδειγμα ρυθμίζει ένα ξέσαμα δύο δευτερολέπτων που αποκαλύπτει το σχήμα χρησιμοποιώντας τον υποτύπο κατεύθυνσης δεξιά. Οι ρυθμίσεις του φίλτρου ανήκουν στη συμπεριφορά μέσα στο εφέ, οπότε ρυθμίζονται αφού αφαιρεθούν οι αρχικές λειτουργίες του προεπιλεγμένου εφέ.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);

    const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.Wipe, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
    effect.getBehaviors().clear();

    const factory = new aspose.slides.BehaviorFactory();
    const filter = factory.createFilterEffect();
    filter.setType(aspose.slides.FilterEffectType.Wipe);
    filter.setSubtype(aspose.slides.FilterEffectSubtype.Right);
    filter.setReveal(aspose.slides.FilterEffectRevealType.In);
    filter.getTiming().setDuration(2);

    effect.getBehaviors().add(filter);

    presentation.save("filter.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Ιδιότητα

Χρησιμοποιήστε το createPropertyEffect για να ανιματίσετε τη διαφάνεια. Τα getFrom, getTo και getBy είναι συμβολοσειρές που ερμηνεύονται χρησιμοποιώντας τα getValueType και getCalcMode. Επιλέξτε άκρα ή μια σχετική μετατόπιση αντί να ορίζετε και τα τρία αδράξια.

Εδώ, το επιλεγμένο χαρακτηριστικό είναι η διαφάνεια, και οι αριθμητικές συμβολοσειρές αντιπροσωπεύουν μια αλλαγή από 25% διαφάνεια σε πλήρη διαφάνεια. Η γραμμική παρεμβολή περιγράφει μια βαθμιαία αλλαγή μεταξύ αυτών των τιμών. Όταν προσαρμόζετε αυτό το παράδειγμα σε άλλο χαρακτηριστικό, επιλέξτε τύπο τιμής και τιμές άκρων κατάλληλες για το συγκεκριμένο χαρακτηριστικό.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);

    const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.Fade, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
    effect.getBehaviors().clear();

    const factory = new aspose.slides.BehaviorFactory();
    const property = factory.createPropertyEffect();
    property.getProperties().add(aspose.slides.BehaviorProperty.getStyleOpacity().getValue());
    property.setValueType(aspose.slides.PropertyValueType.Number);
    property.setCalcMode(aspose.slides.PropertyCalcModeType.Linear);
    property.setFrom("0.25");
    property.setTo("1");
    property.getTiming().setDuration(2);

    effect.getBehaviors().add(property);

    presentation.save("property.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Ορισμός

Χρησιμοποιήστε το createSetEffect για να ορίσετε ορατότητα μέσω του getTo. Μια συμπεριφορά ορισμού δεν κάνει παρεμβολή μεταξύ των άκρων.

Το παράδειγμα επιλέγει το χαρακτηριστικό ορατότητας και αναθέτει τη συμβολοσειρά visible όταν εκτελείται η συμπεριφορά. Το ορθογώνιο είναι ήδη ορατό σε αυτή τη μίνιμυ παρουσίαση, οπότε η ανάθεση μπορεί να μην παράγει εμφανή οπτική αλλαγή από μόνη της. Μια τέτοια λειτουργία είναι χρήσιμη ως μέρος ενός μεγαλύτερου εφέ που ελέγχει επίσης πότε το σχήμα κρύβεται ή γίνεται ορατό.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);

    const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.Appear, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
    effect.getBehaviors().clear();

    const factory = new aspose.slides.BehaviorFactory();
    const set = factory.createSetEffect();
    set.getProperties().add(aspose.slides.BehaviorProperty.getStyleVisibility().getValue());
    set.setTo("visible");

    effect.getBehaviors().add(set);

    presentation.save("set.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Εντολή

Χρησιμοποιήστε το createCommandEffect και ρυθμίστε τα getType, getCommandString, και getShapeTarget. Τοποθετήστε μια ηχογράφημα WAV με όνομα sample.wav στον τρέχοντα φάκελο. Αυτό το παράδειγμα το ενσωματώνει με το addAudioFrameEmbedded και συνδέει μια εντολή αναπαραγωγής στο πλαίσιο ήχου.

Το πλαίσιο ήχου είναι τόσο ο στόχος του εφέ όσο και ο στόχος της εντολής. Αυτό συνδέει το αίτημα αναπαραγωγής με την ενσωματωμένη ηχογράφηση· μια συμβολοσειρά εντολής από μόνη της δεν προσδιορίζει ποιο αντικείμενο πολυμέσων να ελέγξει. Το εφέ ρυθμίζεται να ξεκινά με κλικ κατά τη διάρκεια της παρουσίασης.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const audioStream = java.newInstanceSync("java.io.FileInputStream", "sample.wav");
    try {
        const audioFrame = slide.getShapes().addAudioFrameEmbedded(100, 100, 40, 40, audioStream);

        const effect = slide.getTimeline().getMainSequence().addEffect(audioFrame, aspose.slides.EffectType.MediaPlay, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
        effect.getBehaviors().clear();

        const factory = new aspose.slides.BehaviorFactory();
        const command = factory.createCommandEffect();
        command.setType(java.newByte(aspose.slides.CommandEffectType.Call));
        command.setCommandString("play");
        command.setShapeTarget(audioFrame);

        effect.getBehaviors().add(command);

        presentation.save("command.pptx", aspose.slides.SaveFormat.Pptx);
    } finally {
        audioStream.close();
    }
} finally {
    presentation.dispose();
}

Η αποθήκευση αποθηκεύει την εντολή στο command.pptx; δεν αναπαράγει την ηχογράφηση. Η αναπαραγωγή απαιτεί έναν αναπαραγωγό παρουσίασης που υποστηρίζει την εντολή και τον στόχο πολυμέσων.

Διαχείριση της Συλλογής Συμπεριφορών

Η BehaviorCollection υποστηρίζει τις λειτουργίες add, insert, remove, και removeAt. Αυτό το παράδειγμα ανοίγει το rotation.pptx, προσθέτει κλιμάκωση, τη μετακινεί πριν από την περιστροφή και αφαιρεί την περιστροφή. Η αφαίρεση και η επανεισαγωγή του ίδιου αντικειμένου αλλάζει τη θέση του στην αποθηκευμένη σειρά χωρίς να δημιουργηθεί αντίγραφο.

Η σειρά των επεξεργασιών αλλάζει τη συλλογή από περιστροφή–κλιμάκωση σε κλιμάκωση–περιστροφή, και μετά μόνο σε κλιμάκωση. Οι δείκτες αναφέρονται στην τρέχουσα συλλογή, έτσι η αφαίρεση χρησιμοποιεί το νέο δείκτη της περιστροφής μετά την αναδιάταξη. Η τελική απαρίθμηση επιβεβαιώνει ποια συμπεριφορά θα αποθηκευτεί.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("rotation.pptx");
try {
    const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
    const behaviors = effect.getBehaviors();

    const factory = new aspose.slides.BehaviorFactory();
    const scale = factory.createScaleEffect();
    scale.setTo(java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(125), java.newFloat(125)));
    scale.getTiming().setDuration(2);

    behaviors.add(scale);

    behaviors.remove(scale);
    behaviors.insert(0, scale);
    behaviors.removeAt(1);

    for (let i = 0; i < behaviors.getCount(); i++) {
        const behavior = behaviors.get_Item(i);
        console.log(behavior.getClass().getSimpleName());
    }

    presentation.save("collection-edited.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Η έξοδος είναι ScaleEffect: παραμένει μόνο η κλιμάκωση. Η σειρά στη συλλογή δεν προγραμματίζει από μόνη της τις συμπεριφορές μία μετά την άλλη. Αδειάστε τη συλλογή μόνο όταν αντικαθιστάτε όλες τις λειτουργίες της.

Παραμετροποίηση Χρόνου Συμπεριφοράς

Η Behavior.getTiming αποκαλύπτει το Timing, ανεξάρτητα από το Effect.getTiming. Ο χρόνος του εφέ προγραμματίζει το περιβάλλον εφέ· ο χρόνος της συμπεριφοράς περιγράφει μια λειτουργία μέσα σε αυτό.

Ορισμός Διάρκειας, Καθυστέρησης, Επανάληψης και Επιτάχυνσης

Ανοίξτε το rotation.pptx και ορίστε τη διάρκεια (getDuration) και την καθυστέρηση ενεργοποίησης (getTriggerDelayTime) σε δευτερόλεπτα, έπειτα ρυθμίστε τον αριθμό επαναλήψεων μέσω του setRepeatCount. Τα getAccelerate και getDecelerate είναι κλάσματα της διάρκειας· διατηρήστε το άθροισμά τους το πολύ 1.

Το αρχείο εισόδου είναι αυτό που δημιουργήθηκε στο παράδειγμα περιστροφής, όπου η πρώτη συμπεριφορά είναι γνωστό ότι είναι περιστροφή. Αυτό το παράδειγμα αλλάζει μόνο το χρόνο αυτής της συμπεριφοράς· η γωνία των 90 μοιρών παραμένει αμετάβλητη. Η διαχωρισμένη διαχείριση γωνίας και χρόνου καθιστά ευκολότερη την προσαρμογή του ρυθμού χωρίς να ξαναχτίζει την κίνηση.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("rotation.pptx");
try {
    const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);

    const rotation = effect.getBehaviors().get_Item(0);
    rotation.getTiming().setDuration(2);
    rotation.getTiming().setTriggerDelayTime(java.newFloat(0.5));
    rotation.getTiming().setRepeatCount(3);
    rotation.getTiming().setAccelerate(java.newFloat(0.2));
    rotation.getTiming().setDecelerate(java.newFloat(0.2));

    presentation.save("timing.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Η συμπεριφορά χρησιμοποιεί διάρκεια δύο δευτερολέπτων, καθυστέρηση μισού δευτερολέπτου, και αριθμό επαναλήψεων 3. Το πρώτο και το τελευταίο 20% της διάρκειας χρησιμοποιούνται για επιτάχυνση και επιβράδυνση.

Άλλες πολιτικές επανάληψης περιλαμβάνουν τα getRepeatDuration, getRepeatUntilEndSlide, και getRepeatUntilNextClick; επιλέξτε μια πολιτική αντί να τις ενεργοποιείτε όλες μαζί. Το getAutoReverse παίζει την κίνηση ανάποδα μετά το εμπρός πέρασμα. Η επιτάχυνση και η επιβράδυνση εφαρμόζονται σε συνεχείς αλλαγές, όχι σε διακριτές αναθέσεις ή εντολές.

Δημιουργία Διαδρομής Κίνησης

Χρησιμοποιήστε το createMotionEffect για να δημιουργήσετε κίνηση. Τα getFrom, getTo, και getBy περιγράφουν συντεταγμένες ή μετατοπίσεις με βάση το ποσοστό. Για επεξεργάσιμη διαδρομή, δημιουργήστε ένα MotionPath και αναθέστε το με το MotionEffect.setPath. Το MotionPath αποθηκεύει τις εντολές της διαδρομής.

Εντολή Σημεία Σημασία
MoveTo One Ορίζει την αρχική θέση.
LineTo One Μετακινείται κατά μήκος μιας ευθείας κατεύθυνσης μέχρι το άκρο της.
CurveTo Three Ακολουθεί μια κυβική καμπύλη που ορίζεται από δύο σημεία ελέγχου και ένα άκρο.
CloseLoop None Επιστρέφει στην αρχική θέση.
End None Ολοκληρώνει τη διαδρομή.

Το MotionPathPointsType περιγράφει χαρακτηριστικά επεξεργασίας σημείων, όπως γωνιακά ή λείες σημεία. Δεν αντικαθιστά τον τύπο εντολής. Χρησιμοποιήστε τύπο σημείου καμπύλης για το παράδειγμα καμπύλης παρακάτω και τύπο σημείου γωνίας για τα ευθύγραμμα τμήματα.

Οι συντεταγμένες της διαδρομής είναι κανονικοποιημένες στις διαστάσεις της διαφάνειας: μια μετατόπιση X 0.25 αντιπροσωπεύει το ένα τέταρτο του πλάτους της διαφάνειας, όχι 0.25 μονάδες. Θετικό Y κατευθύνεται προς τα κάτω. Οι απόλυτες εντολές καθορίζουν θέσεις στο σύστημα συντεταγμένων της διαδρομής· οι σχετικές εντολές καθορίζουν μετατοπίσεις από την τρέχουσα θέση. Αυτό είναι διαφορετικό από το getOrigin, το οποίο επιλέγει το πλαίσιο αναφοράς της διαδρομής, και το getPathEditMode, το οποίο ελέγχει πώς η διαδρομή κινείται όταν το σχήμα μετακινείται.

Δημιουργία Ευθείας Διαδρομής

Δημιουργήστε μια συμπεριφορά κίνησης με ένα αρχικό σημείο, ένα ευθύ τμήμα και μια εντολή λήξης. Το MotionPath.add δέχεται τον τύπο εντολής, τα σημεία της, τον τύπο σημείου και μια ένδειξη σχετικών συντεταγμένων.

Η αρχική εντολή καθιερώνει (0, 0), και η γραμμή λήγει στο (0.25, 0), δίνοντας στη διαδρομή οριζόντια μετατόπιση ενός τέταρτου του πλάτους της διαφάνειας. Η εντολή λήξης δεν έχει σημεία συντεταγμένων. Μόλις η διαδρομή ανατεθεί, η προσθήκη της συμπεριφοράς κίνησης στο εφέ συνδέει αυτή τη διαδρομή με το ορθογώνιο.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation();
try {
    const slide = presentation.getSlides().get_Item(0);

    const shape = slide.getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 160, 80);

    const effect = slide.getTimeline().getMainSequence().addEffect(shape, aspose.slides.EffectType.PathRight, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.OnClick);
    effect.getBehaviors().clear();

    const factory = new aspose.slides.BehaviorFactory();
    const motion = factory.createMotionEffect();
    motion.setOrigin(aspose.slides.MotionOriginType.Layout);
    motion.getTiming().setDuration(2);

    const path = new aspose.slides.MotionPath();
    path.add(aspose.slides.MotionCommandPathType.MoveTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0), java.newFloat(0))]), aspose.slides.MotionPathPointsType.Auto, false);
    path.add(aspose.slides.MotionCommandPathType.LineTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.25), java.newFloat(0))]), aspose.slides.MotionPathPointsType.Corner, false);
    path.add(aspose.slides.MotionCommandPathType.End, java.newArray("java.awt.geom.Point2D$Float", []), aspose.slides.MotionPathPointsType.None, false);

    motion.setPath(path);
    effect.getBehaviors().add(motion);

    presentation.save("motion.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

motion.pptx περιέχει μια συμπεριφορά κίνησης με τρεις εντολές διαδρομής. Τα παρακάτω παραδείγματα επεξεργασίας αρχείου χρησιμοποιούν αυτή τη γνωστή δομή.

Σύγκριση Απόλυτων και Σχετικών Συντεταγμένων

Αυτά τα δύο αντικείμενα διαδρομής περιγράφουν την ίδια διαδρομή. Η απόλυτη εντολή λήγει στο (0.3, 0.1); η σχετική εντολή προσθέτει (0.1, 0.1) στην τρέχουσα θέση, (0.2, 0).

Και οι δύο διαδρομές ξεκινούν από την ίδια θέση. Για τη σχετική γραμμή, προσθέστε τις μετατοπίσεις X και Y στην τρέχουσα θέση για να λάβετε το άκρο· για την απόλυτη γραμμή, διαβάστε το άκρο άμεσα. Η αλλαγή του σημαιού χωρίς να μετατρέψετε τις συντεταγμένες θα περιγράψει διαφορετική διαδρομή.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const absolutePath = new aspose.slides.MotionPath();
absolutePath.add(aspose.slides.MotionCommandPathType.MoveTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.2), java.newFloat(0))]), aspose.slides.MotionPathPointsType.Auto, false);
absolutePath.add(aspose.slides.MotionCommandPathType.LineTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.3), java.newFloat(0.1))]), aspose.slides.MotionPathPointsType.Corner, false);

const relativePath = new aspose.slides.MotionPath();
relativePath.add(aspose.slides.MotionCommandPathType.MoveTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.2), java.newFloat(0))]), aspose.slides.MotionPathPointsType.Auto, false);
relativePath.add(aspose.slides.MotionCommandPathType.LineTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.1), java.newFloat(0.1))]), aspose.slides.MotionPathPointsType.Corner, true);

Αντιστοιχίστε οποιαδήποτε από τις διαδρομές σε μια συμπεριφορά κίνησης για να τη χρησιμοποιήσετε σε μια παρουσίαση. Το τελικό λογικό επιχείρημα επιλέγει σχετικές συντεταγμένες για αυτή την εντολή.

Αντικατάσταση Γραμμής με Καμπύλη

Ανοίξτε το motion.pptx και αντικαταστήστε την εντολή γραμμής του με μια κυβική καμπύλη. Δώστε πρώτα τα δύο σημεία ελέγχου, ακολουθούμενα από το άκρο.

Η αρχική θέση παρέχεται από την προηγούμενη εντολή. Τα πρώτα δύο σημεία διαμορφώνουν την καμπύλη, ενώ το τρίτο είναι ο προορισμός της· δεν είναι τρία διαδοχικά σημεία προορισμού. Η ενημέρωση του τύπου εντολής, του τύπου επεξεργασίας σημείων και του πίνακα σημείων μαζί διατηρεί το τμήμα συνεπές με τη νέα του γεωμετρία.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("motion.pptx");
try {
    const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
    const motion = effect.getBehaviors().get_Item(0);

    const path = motion.getPath();
    path.get_Item(1).setCommandType(aspose.slides.MotionCommandPathType.CurveTo);
    path.get_Item(1).setPointsType(aspose.slides.MotionPathPointsType.CurveSmooth);
    path.get_Item(1).setPoints(java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.1), java.newFloat(0)), java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.2), java.newFloat(0.1)), java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.3), java.newFloat(0.1))]));

    presentation.save("curve.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Η διαδρομή στο curve.pptx εξακολουθεί να έχει τρεις εντολές· η μεσαία εντολή τώρα ορίζει μια καμπύλη.

Επιθεώρηση και Επεξεργασία Αποθηκευμένης Διαδρομής

Κάθε MotionCmdPath αποκαλύπτει τα getPoints, getCommandType, getPointsType, και isRelative. Τα παρακάτω παραδείγματα χρησιμοποιούν τη γνωστή διαδρομή τριών εντολών στο motion.pptx. Για αυθαίρετη είσοδο, εντοπίστε το επιθυμητό εφέ και ελέγξτε τους τύπους εντολών και τον αριθμό σημείων πριν την επεξεργασία κατά δείκτη.

Ανάγνωση Εντολών και Συντεταγμένων

Διαβάστε τη διαδρομή χωρίς να την αλλάξετε. Οι εντολές End και CloseLoop δεν χρειάζονται σημεία, έτσι επιτρέψτε έναν μηδενικό πίνακα σημείων.

Η έξοδος ζεύγεται κάθε αριθμητικό τύπο εντολής με τη σημαία σχετικών συντεταγμένων πριν καταγράψει τα σημεία του. Αυτό σας επιτρέπει να ξεχωρίσετε ένα άκρο από μια μετατόπιση πριν τροποποιήσετε τη διαδρομή. Μια καμπύλη θα κατέγραφε τρία σημεία, ενώ η ευθεία γραμμή σε αυτό το αρχείο καταγράφει μόνο ένα.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("motion.pptx");
try {
    const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
    const motion = effect.getBehaviors().get_Item(0);

    const path = motion.getPath();
    for (let i = 0; i < path.getCount(); i++) {
        const segment = path.get_Item(i);
        console.log(segment.getCommandType() + ", relative: " + segment.isRelative());
        const points = segment.getPoints();
        if (points != null) {
            for (const point of points) {
                console.log("X=" + point.getX() + ", Y=" + point.getY());
            }
        }
    }
} finally {
    presentation.dispose();
}

Η λίστα περιέχει ένα αρχικό σημείο, μια απόλυτη γραμμή που λήγει στο (0.25, 0), και μια εντολή λήξης.

Αλλαγή Άκρου

Ανοίξτε το motion.pptx και αντικαταστήστε τον πίνακα σημείων της γραμμής για να μετακινήσετε το άκρο της.

Στο αρχείο εισόδου, ο δείκτης 0 είναι η αρχική εντολή και ο δείκτης 1 η γραμμή. Η αντικατάσταση του μοναδικού σημείου της γραμμής αλλάζει τον προορισμό της χωρίς να αλλάζει τον τύπο εντολής, τον χρόνο ή τη θέση της στη συλλογή. Επειδή η εντολή χρησιμοποιεί απόλυτες συντεταγμένες, το νέο ζευγάρι καθορίζει θέση αντί μετατόπισης.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("motion.pptx");
try {
    const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);

    const motion = effect.getBehaviors().get_Item(0);
    motion.getPath().get_Item(1).setPoints(java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.4), java.newFloat(0.1))]));

    presentation.save("motion-endpoint.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Η γραμμή στο motion-endpoint.pptx λήγει στο (0.4, 0.1); το αρχικό αρχείο παραμένει αμετάβλητο.

Αντικατάσταση Τμήματος

Χρησιμοποιήστε τα insert και removeAt για να αντικαταστήσετε τη γραμμή στο motion.pptx. Η εισαγωγή μετατοπίζει την παλιά γραμμή στον δείκτη 2.

Αυτό δείχνει την αντικατάσταση ενός αντικειμένου εντολής αντί για επεξεργασία των υφιστάμενων συντεταγμένων. Μετά την εισαγωγή, η συλλογή περιέχει προσωρινά την αρχική εντολή, τη νέα γραμμή, την παλιά γραμμή και την εντολή λήξης. Η αφαίρεση του δείκτη 2 απορρίπτει την παλιά γραμμή και αφήνει τη νέα διαδρομή στη θέση της.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("motion.pptx");
try {
    const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);
    const motion = effect.getBehaviors().get_Item(0);

    const path = motion.getPath();
    path.insert(1, aspose.slides.MotionCommandPathType.LineTo, java.newArray("java.awt.geom.Point2D$Float", [java.newInstanceSync("java.awt.geom.Point2D$Float", java.newFloat(0.2), java.newFloat(0.1))]), aspose.slides.MotionPathPointsType.Corner, false);
    path.removeAt(2);

    presentation.save("motion-edited.pptx", aspose.slides.SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Η αποθηκευμένη διαδρομή εξακολουθεί να έχει τρεις εντολές, με τη νέα γραμμή να λήγει στο (0.2, 0.1) και την εντολή λήξης τέλος.

Τροποποίηση και Επαλήθευση Υπάρχουσας Συμπεριφοράς

Όταν δεν είναι γνωστός ο δείκτης της συμπεριφοράς, επιλέξτε το με βάση τον τύπο. Αυτό το παράδειγμα ανοίγει το rotation.pptx, εντοπίζει το RotationEffect, αλλάζει την γωνία και ελέγχει την αποθηκευμένη τιμή μετά το ξανά άνοιγμα.

Ο έλεγχος τύπου επιτρέπει στο βρόχο να παραλείψει συμπεριφορές που δεν είναι περιστροφές. Το δεύτερο φόρτωμα διαβάζει το αποθηκευμένο αρχείο σε ξεχωριστό αντικείμενο παρουσίασης, έτσι η σύγκριση ελέγχει τα αποθηκευμένα δεδομένα αντί της τιμής που παραμένει στη μνήμη. Αυτό το παράδειγμα υποθέτει ακόμη ότι το γνωστό εφέ είναι πρώτο στην κύρια ακολουθία· η επιλογή συμπεριφοράς με βάση τον τύπο δεν εντοπίζει το σωστό εφέ σε αυθαίρετη παρουσίαση.

const aspose = { slides: require("aspose.slides.via.java") };
const java = require("java");

const presentation = new aspose.slides.Presentation("rotation.pptx");
try {
    const effect = presentation.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);

    for (let i = 0; i < effect.getBehaviors().getCount(); i++) {
        const behavior = effect.getBehaviors().get_Item(i);
        if (java.instanceOf(behavior, "com.aspose.slides.IRotationEffect")) {
            const rotation = behavior;
            rotation.setBy(180);
        }
    }

    presentation.save("rotation-edited.pptx", aspose.slides.SaveFormat.Pptx);

    const reopened = new aspose.slides.Presentation("rotation-edited.pptx");
    try {
        const savedEffect = reopened.getSlides().get_Item(0).getTimeline().getMainSequence().get_Item(0);

        for (let i = 0; i < savedEffect.getBehaviors().getCount(); i++) {
            const behavior = savedEffect.getBehaviors().get_Item(i);
            if (java.instanceOf(behavior, "com.aspose.slides.IRotationEffect")) {
                const rotation = behavior;
                console.log("Rotation preserved: " + (Math.abs(rotation.getBy() - 180) < 0.001));
            }
        }
    } finally {
        reopened.dispose();
    }
} finally {
    presentation.dispose();
}

Η έξοδος είναι Rotation preserved: true. Εφαρμόστε το ίδιο μοτίβο ελέγχου τύπου σε άλλες συμπεριφορές. Για πλήρη έλεγχο διατήρησης, συγκρίνετε το σχήμα-στόχο, το εφέ, τους τύπους και τη σειρά των συμπεριφορών, το χρόνο και τις εντολές διαδρομής. Χρησιμοποιήστε αριθμητική ανοχή για τιμές κινητής υποδιαστολής. Για παρουσίαση με άγνωστο σχεδιασμό κίνησης, δείτε Ανάγνωση Κινήσεων Σχημάτων για τη διέλευση των κύριων και διαδραστικών ακολουθιών.

Σειρά Συμπεριφορών, Προεπιλογές και Αναπαραγωγή

Η σειρά στη BehaviorCollection είναι η αποθηκευμένη σειρά των λειτουργιών ενός εφέ. Δεν είναι λίστα αναπαραγωγής όπου κάθε συμπεριφορά περιμένει αυτόματα την προηγούμενη. Ο χρόνος και το περιβάλλον εφέ καθορίζουν το χρονοπρόγραμμα. Οι συμπεριφορές μπορούν να επικαλύπτονται, και λειτουργίες στο ίδιο χαρακτηριστικό μπορεί να αλληλεπιδρούν μέσω των getAdditive και getAccumulate. Μην χρησιμοποιείτε μόνο την επαναταξινόμηση της συλλογής για να προγραμματίσετε «μετακίνηση, στη συνέχεια περιστροφή»· χρησιμοποιήστε ρητό χρόνο ή ξεχωριστά εφέ όπως περιγράφεται στην ενότητα Κίνηση Σχήματος.

Τα getType και getSubtype του εφέ περιγράφουν το προεπιλεγμένο εφέ του. Δεν αποτελούν πλήρη περιγραφή ενός επεξεργασμένου δένδρου συμπεριφορών. Επιλέξτε το προεπιλεγμένο εφέ και τον υποτύπο πριν προσαρμόσετε τις συμπεριφορές: η αλλαγή του προεπιλεγμένου εφέ μπορεί να ξαναχτίσει τη συλλογή και να διαγράψει τις προσαρμοσμένες σας λειτουργίες. Για παράδειγμα, η αλλαγή ενός προσαρμοσμένου εφέ Spin σε Fade μπορεί να αντικαταστήσει τη συμπεριφορά περιστροφής με συμπεριφορές set και filter. Ελέγξτε ξανά τη συλλογή μετά την αλλαγή του προεπιλεγμένου εφέ ή του υποτύπου. Η εκκαθάριση των προεπιλεγμένων συμπεριφορών μπορεί επίσης να αφαιρέσει λειτουργίες ορατότητας ή εκκίνησης που απαιτούνται από το προεπιλεγμένο εφέ. Τα παραδείγματα χρησιμοποιούν εκ προθέσεως ορατά σχήματα και αντικαθιστούν τις συμπεριφορές· δεν ανακατασκευάζουν κάθε υλοποίηση προεπιλογής.

Συμβατότητα Μορφών

Ένα διατηρημένο δένδρο συμπεριφορών δεν εγγυάται την ίδια αναπαραγωγή σε κάθε προγράμμα προβολής ή μηχανή εξαγωγής. Ελέγξτε τα αποθηκευμένα δεδομένα και το παραγόμενο αποτέλεσμα ξεχωριστά.

Μορφή ή έξοδος Τι πρέπει να ελεγχθεί
PPTX Χρησιμοποιήστε το ως κύρια μορφή για αυτά τα παραδείγματα. Ανοίξτε το ξανά για να επαληθεύσετε το επεξεργάσιμο δένδρο συμπεριφορών, έπειτα ελέγξτε την αναπαραγωγή στην επιθυμητή έκδοση του PowerPoint.
PPT Η παλαιότερη δυαδική αναπαράσταση μπορεί να διαφέρει από το PPTX. Δοκιμάστε έναν ξεχωριστό κύκλο αποθήκευσης-ανοίγματος και αναπαραγωγής· μην θεωρείτε ότι υποστηρίζεται κάθε προσαρμοσμένος συνδυασμός με επιτυχία του PPTX.
PDF, PNG, JPEG, and other static slide images Περιέχουν μια στατική αναπαράσταση της διαφάνειας, όχι μια αναγγέλλσιμη χρονογραμμή κίνησης ή εγγυημένο τελικό καρέ κίνησης.
HTML5 Μπορεί να αναπαράγει υποστηριζόμενες κινήσεις όταν η κίνηση σχήματος είναι ενεργοποιημένη στις επιλογές εξαγωγής. Δοκιμάστε προσαρμοσμένους συνδυασμούς στον περιηγητή.
Animated GIF Αποθηκεύει τα καρέ που αποτυπώνονται, όχι επεξεργάσιμες συμπεριφορές ή αλληλεπιδράσεις που ενεργοποιούνται με κλικ. Ελέγξτε την πραγματική κίνηση που αποτυπώθηκε.
Video Αποδίδει τα καρέ κίνησης και τα κωδικοποιεί ως βίντεο. Η υποστήριξη περιορίζεται στις υποστηριζόμενες κινήσεις και εφέ του εξαγωγέα· οι εντολές και τα διαδραστικά γεγονότα δεν γίνονται επεξεργάσιμη χρονογραμμή.

Συχνές Ερωτήσεις

Γιατί το εφέ μου περιέχει συμπεριφορές πριν προσθέσω κάτι;

Δημιουργώντας ένα προεπιλεγμένο εφέ μπορεί να δημιουργήσει τις υποκείμενες λειτουργίες του. Επιθεωρήστε τις πριν αποφασίσετε αν θα επεκτείνετε το προεπιλεγμένο εφέ ή θα αντικαταστήσετε τις συμπεριφορές του.

Κάνει η μετακίνηση μιας συμπεριφοράς στην αρχή να παίζει πρώτη;

Δεν είναι απαραίτητα. Η σειρά της συλλογής δεν υποκαθιστά τον χρόνο. Ελέγξτε τις καθυστερήσεις, τις διάρκειες και τις αλληλεπιδράσεις μεταξύ λειτουργιών στο ίδιο χαρακτηριστικό.

Γιατί μια εντολή λήξης δεν έχει σημεία;

Σηματοδοτεί το τέλος της διαδρομής και δεν χρειάζονται συντεταγμένες. Ελέγξτε για έναν μηδενικό πίνακα σημείων όταν επιθεωρείτε μια διαδρομή που διαβάζεται από αρχείο.

Είναι ένα επιτυχημένο κύκλο γύρο αρκετό για να επιβεβαιώσει την αναπαραγωγή;

Όχι. Το άνοιγμα ξανά επιβεβαιώνει τη διατήρηση των ιδιοτήτων που ελέγξατε. Δοκιμάστε τον αναπαραγωγό παρουσίασης ή την εξαγωγή με κινούμενα γραφικά ξεχωριστά για να επιβεβαιώσετε τη μορφή συμπεριφοράς του.