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

Επισκόπηση

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

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

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

Μια κίνηση οργανώνεται ως Timeline → Sequence → Effect → Behaviors:

  • Η διαφάνεια περιέχει το get_Timeline της, το οποίο περιλαμβάνει την κύρια ακολουθία και τις διαδραστικές ακολουθίες.
  • Μία ISequence περιέχει εφέ, πιθανόν με διαφορετικά σχήματα-στόχους.
  • Μία IEffect προσδιορίζει το σχήμα-στόχο, το preset, το υποτύπο και το χρονοδιάστημα του εφέ.
  • Η IEffect::get_Behaviors περιέχει τις λειτουργίες που υλοποιούν το εφέ: αλλαγή χρώματος, μετακίνηση, περιστροφή, ορισμός ιδιότητας κ.ά.

Δημιουργία Ατομικών Συμπεριφορών

Καλέστε το ISequence::AddEffect για να δημιουργήσετε ένα εφέ και να αποκτήσετε πρόσβαση στη συλλογή get_Behaviors του. Ένα preset μπορεί να γεμίσει αυτή τη συλλογή αυτόματα. Διατηρήστε τις λειτουργίες του όταν επεκτείνετε το preset ή χρησιμοποιήστε Clear όταν τις αντικαθιστάτε σκόπιμα.

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

Περιστροφή

Χρησιμοποιήστε το CreateRotationEffect για να δημιουργήσετε μια περιστροφή. Η get_By καθορίζει μια σχετική γωνία σε μοίρες· οι get_From και get_To ορίζουν τα άκρα.

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

#include <DOM/Animation/BehaviorFactory.h>
#include <DOM/Animation/EffectSubtype.h>
#include <DOM/Animation/EffectTriggerType.h>
#include <DOM/Animation/EffectType.h>
#include <DOM/Animation/IBehaviorCollection.h>
#include <DOM/Animation/IEffect.h>
#include <DOM/Animation/IRotationEffect.h>
#include <DOM/Animation/ISequence.h>
#include <DOM/Animation/ITiming.h>
#include <DOM/IAnimationTimeLine.h>
#include <DOM/IAutoShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/ShapeType.h>
#include <Export/SaveFormat.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace Aspose::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);

auto shape = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 100, 100, 160, 80);

auto effect = slide->get_Timeline()->get_MainSequence()->AddEffect(shape, EffectType::Spin, EffectSubtype::None, EffectTriggerType::OnClick);
effect->get_Behaviors()->Clear();

auto factory = MakeObject<BehaviorFactory>();
auto rotation = factory->CreateRotationEffect();
rotation->set_By(90.0f);
rotation->get_Timing()->set_Duration(2.0f);

effect->get_Behaviors()->Add(rotation);

presentation->Save(u"rotation.pptx", SaveFormat::Pptx);

presentation->Dispose();

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

Κλιμάκωση

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

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

#include <DOM/Animation/BehaviorFactory.h>
#include <DOM/Animation/EffectSubtype.h>
#include <DOM/Animation/EffectTriggerType.h>
#include <DOM/Animation/EffectType.h>
#include <DOM/Animation/IBehaviorCollection.h>
#include <DOM/Animation/IEffect.h>
#include <DOM/Animation/IScaleEffect.h>
#include <DOM/Animation/ISequence.h>
#include <DOM/Animation/ITiming.h>
#include <DOM/IAnimationTimeLine.h>
#include <DOM/IAutoShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/ShapeType.h>
#include <Export/SaveFormat.h>
#include <drawing/point_f.h>
#include <system/array.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace Aspose::Slides::Export;
using namespace System;
using namespace System::Drawing;

auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);

auto shape = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 100, 100, 160, 80);

auto effect = slide->get_Timeline()->get_MainSequence()->AddEffect(shape, EffectType::GrowShrink, EffectSubtype::None, EffectTriggerType::OnClick);
effect->get_Behaviors()->Clear();

auto factory = MakeObject<BehaviorFactory>();
auto scale = factory->CreateScaleEffect();
scale->set_From(PointF(100, 100));
scale->set_To(PointF(125, 125));
scale->get_Timing()->set_Duration(2.0f);

effect->get_Behaviors()->Add(scale);

presentation->Save(u"scale.pptx", SaveFormat::Pptx);

presentation->Dispose();

Χρώμα

Χρησιμοποιήστε το CreateColorEffect για να αλλάξετε τη γέμιση από μπλε σε πορτοκαλί. Οι get_From και get_To είναι χρώματα· η get_By είναι μια απόκλιση χρώματος. Η IBehavior::get_Properties προσδιορίζει το χαρακτηριστικό που κινείται.

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

#include <DOM/Animation/BehaviorFactory.h>
#include <DOM/Animation/BehaviorProperty.h>
#include <DOM/Animation/EffectSubtype.h>
#include <DOM/Animation/EffectTriggerType.h>
#include <DOM/Animation/EffectType.h>
#include <DOM/Animation/IBehaviorCollection.h>
#include <DOM/Animation/IBehaviorPropertyCollection.h>
#include <DOM/Animation/IColorEffect.h>
#include <DOM/Animation/IEffect.h>
#include <DOM/Animation/ISequence.h>
#include <DOM/Animation/ITiming.h>
#include <DOM/FillType.h>
#include <DOM/IAnimationTimeLine.h>
#include <DOM/IAutoShape.h>
#include <DOM/IColorFormat.h>
#include <DOM/IFillFormat.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/ShapeType.h>
#include <Export/SaveFormat.h>
#include <drawing/color.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace Aspose::Slides::Export;
using namespace System;
using namespace System::Drawing;

auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);

auto shape = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 100, 100, 160, 80);
shape->get_FillFormat()->set_FillType(FillType::Solid);
shape->get_FillFormat()->get_SolidFillColor()->set_Color(Color::get_Blue());

auto effect = slide->get_Timeline()->get_MainSequence()->AddEffect(shape, EffectType::ChangeFillColor, EffectSubtype::None, EffectTriggerType::OnClick);
effect->get_Behaviors()->Clear();

auto factory = MakeObject<BehaviorFactory>();
auto color = factory->CreateColorEffect();
color->get_Properties()->Add(BehaviorProperty::get_FillColor()->get_Value());
color->get_From()->set_Color(Color::get_Blue());
color->get_To()->set_Color(Color::get_Orange());
color->get_Timing()->set_Duration(2.0f);

effect->get_Behaviors()->Add(color);

presentation->Save(u"color.pptx", SaveFormat::Pptx);

presentation->Dispose();

Φίλτρο

Χρησιμοποιήστε το CreateFilterEffect για να επιλέξετε ένα wipe. Οι get_Type, get_Subtype και get_Reveal καθορίζουν το φίλτρο, την κατεύθυνση και το αν θα αποκαλύψει ή θα κρύψει το σχήμα.

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

#include <DOM/Animation/BehaviorFactory.h>
#include <DOM/Animation/EffectSubtype.h>
#include <DOM/Animation/EffectTriggerType.h>
#include <DOM/Animation/EffectType.h>
#include <DOM/Animation/FilterEffectRevealType.h>
#include <DOM/Animation/FilterEffectSubtype.h>
#include <DOM/Animation/FilterEffectType.h>
#include <DOM/Animation/IBehaviorCollection.h>
#include <DOM/Animation/IEffect.h>
#include <DOM/Animation/IFilterEffect.h>
#include <DOM/Animation/ISequence.h>
#include <DOM/Animation/ITiming.h>
#include <DOM/IAnimationTimeLine.h>
#include <DOM/IAutoShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/ShapeType.h>
#include <Export/SaveFormat.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace Aspose::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);

auto shape = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 100, 100, 160, 80);

auto effect = slide->get_Timeline()->get_MainSequence()->AddEffect(shape, EffectType::Wipe, EffectSubtype::None, EffectTriggerType::OnClick);
effect->get_Behaviors()->Clear();

auto factory = MakeObject<BehaviorFactory>();
auto filter = factory->CreateFilterEffect();
filter->set_Type(FilterEffectType::Wipe);
filter->set_Subtype(FilterEffectSubtype::Right);
filter->set_Reveal(FilterEffectRevealType::In);
filter->get_Timing()->set_Duration(2.0f);

effect->get_Behaviors()->Add(filter);

presentation->Save(u"filter.pptx", SaveFormat::Pptx);

presentation->Dispose();

Ιδιότητα

Χρησιμοποιήστε το CreatePropertyEffect για να κινήσετε την αδιαφάνεια. Οι get_From, get_To και get_By είναι συμβολοσειρές που ερμηνεύονται με τη get_ValueType και τη get_CalcMode. Επιλέξτε άκρα ή σχετική απόκλιση αντί να ορίζετε και τα τρία αδιάφορα.

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

#include <DOM/Animation/BehaviorFactory.h>
#include <DOM/Animation/BehaviorProperty.h>
#include <DOM/Animation/EffectSubtype.h>
#include <DOM/Animation/EffectTriggerType.h>
#include <DOM/Animation/EffectType.h>
#include <DOM/Animation/IBehaviorCollection.h>
#include <DOM/Animation/IBehaviorPropertyCollection.h>
#include <DOM/Animation/IEffect.h>
#include <DOM/Animation/IPropertyEffect.h>
#include <DOM/Animation/ISequence.h>
#include <DOM/Animation/ITiming.h>
#include <DOM/Animation/PropertyCalcModeType.h>
#include <DOM/Animation/PropertyValueType.h>
#include <DOM/IAnimationTimeLine.h>
#include <DOM/IAutoShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/ShapeType.h>
#include <Export/SaveFormat.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace Aspose::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);

auto shape = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 100, 100, 160, 80);

auto effect = slide->get_Timeline()->get_MainSequence()->AddEffect(shape, EffectType::Fade, EffectSubtype::None, EffectTriggerType::OnClick);
effect->get_Behaviors()->Clear();

auto factory = MakeObject<BehaviorFactory>();
auto property = factory->CreatePropertyEffect();
property->get_Properties()->Add(BehaviorProperty::get_StyleOpacity()->get_Value());
property->set_ValueType(PropertyValueType::Number);
property->set_CalcMode(PropertyCalcModeType::Linear);
property->set_From(u"0.25");
property->set_To(u"1");
property->get_Timing()->set_Duration(2.0f);

effect->get_Behaviors()->Add(property);

presentation->Save(u"property.pptx", SaveFormat::Pptx);

presentation->Dispose();

Ορισμός

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

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

#include <DOM/Animation/BehaviorFactory.h>
#include <DOM/Animation/BehaviorProperty.h>
#include <DOM/Animation/EffectSubtype.h>
#include <DOM/Animation/EffectTriggerType.h>
#include <DOM/Animation/EffectType.h>
#include <DOM/Animation/IBehaviorCollection.h>
#include <DOM/Animation/IBehaviorPropertyCollection.h>
#include <DOM/Animation/IEffect.h>
#include <DOM/Animation/ISequence.h>
#include <DOM/Animation/ISetEffect.h>
#include <DOM/IAnimationTimeLine.h>
#include <DOM/IAutoShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/ShapeType.h>
#include <Export/SaveFormat.h>
#include <system/object_ext.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace Aspose::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);

auto shape = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 100, 100, 160, 80);

auto effect = slide->get_Timeline()->get_MainSequence()->AddEffect(shape, EffectType::Appear, EffectSubtype::None, EffectTriggerType::OnClick);
effect->get_Behaviors()->Clear();

auto factory = MakeObject<BehaviorFactory>();
auto set = factory->CreateSetEffect();
set->get_Properties()->Add(BehaviorProperty::get_StyleVisibility()->get_Value());
auto visibility = ObjectExt::Box<String>(u"visible");
set->set_To(visibility);

effect->get_Behaviors()->Add(set);

presentation->Save(u"set.pptx", SaveFormat::Pptx);

presentation->Dispose();

Εντολή

Χρησιμοποιήστε το CreateCommandEffect και διαμορφώστε τις get_Type, get_CommandString και get_ShapeTarget. Τοποθετήστε μια ηχογράφηση WAV με όνομα sample.wav στον κατάλογο εργασίας. Αυτό το παράδειγμα την ενσωματώνει με το AddAudioFrameEmbedded και προσθέτει μια εντολή αναπαραγωγής στο πλαίσιο ήχου.

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

#include <DOM/Animation/BehaviorFactory.h>
#include <DOM/Animation/CommandEffectType.h>
#include <DOM/Animation/EffectSubtype.h>
#include <DOM/Animation/EffectTriggerType.h>
#include <DOM/Animation/EffectType.h>
#include <DOM/Animation/IBehaviorCollection.h>
#include <DOM/Animation/ICommandEffect.h>
#include <DOM/Animation/IEffect.h>
#include <DOM/Animation/ISequence.h>
#include <DOM/IAnimationTimeLine.h>
#include <DOM/IAudioFrame.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <system/io/file.h>
#include <system/io/file_stream.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace Aspose::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);

auto audioStream = IO::File::OpenRead(u"sample.wav");
auto audioFrame = slide->get_Shapes()->AddAudioFrameEmbedded(100, 100, 40, 40, audioStream);

auto effect = slide->get_Timeline()->get_MainSequence()->AddEffect(audioFrame, EffectType::MediaPlay, EffectSubtype::None, EffectTriggerType::OnClick);
effect->get_Behaviors()->Clear();

auto factory = MakeObject<BehaviorFactory>();
auto command = factory->CreateCommandEffect();
command->set_Type(CommandEffectType::Call);
command->set_CommandString(u"play");
command->set_ShapeTarget(audioFrame);

effect->get_Behaviors()->Add(command);

presentation->Save(u"command.pptx", SaveFormat::Pptx);

audioStream->Close();

presentation->Dispose();

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

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

IBehaviorCollection υποστηρίζει τις μεθόδους Add, Insert, Remove, και RemoveAt. Αυτό το παράδειγμα ανοίγει το rotation.pptx, προσθέτει κλιμάκωση, τη μετακινεί πριν από την περιστροφή και αφαιρεί την περιστροφή. Η αφαίρεση και η επανεισαγωγή του ίδιου αντικειμένου αλλάζει τη θέση του αποθηκευμένου στοιχείου χωρίς να δημιουργεί αντίγραφο.

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

#include <DOM/Animation/BehaviorFactory.h>
#include <DOM/Animation/IBehaviorCollection.h>
#include <DOM/Animation/IEffect.h>
#include <DOM/Animation/IScaleEffect.h>
#include <DOM/Animation/ISequence.h>
#include <DOM/Animation/ITiming.h>
#include <DOM/IAnimationTimeLine.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <drawing/point_f.h>
#include <system/array.h>
#include <system/console.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace Aspose::Slides::Export;
using namespace System;
using namespace System::Drawing;

auto presentation = MakeObject<Presentation>(u"rotation.pptx");
auto effect = presentation->get_Slide(0)->get_Timeline()->get_MainSequence()->idx_get(0);
auto behaviors = effect->get_Behaviors();

auto factory = MakeObject<BehaviorFactory>();
auto scale = factory->CreateScaleEffect();
scale->set_To(PointF(125, 125));
scale->get_Timing()->set_Duration(2.0f);

behaviors->Add(scale);

behaviors->Remove(scale);
behaviors->Insert(0, scale);
behaviors->RemoveAt(1);

for (auto behavior : behaviors)
    Console::WriteLine(behavior->GetType().get_Name());

presentation->Save(u"collection-edited.pptx", SaveFormat::Pptx);

presentation->Dispose();

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

Διαμόρφωση Χρονοδιαγράμματος Συμπεριφοράς

IBehavior::get_Timing εκθέτει το ITiming, ανεξάρτητα από το IEffect::get_Timing. Το χρονοδιάστημα του εφέ προγραμματίζει το περιβάλλον εφέ· το χρονοδιάστημα της συμπεριφοράς περιγράφει μια λειτουργία εντός αυτού.

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

Ανοίξτε το rotation.pptx και ορίστε τις μεθόδους get_Duration και get_TriggerDelayTime (σε δευτερόλεπτα), έπειτα διαμορφώστε το get_RepeatCount. Τα get_Accelerate και get_Decelerate είναι κλάσματα της διάρκειας· διατηρήστε το άθροισμά τους το πολύ 1.

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

#include <DOM/Animation/IBehaviorCollection.h>
#include <DOM/Animation/IEffect.h>
#include <DOM/Animation/IRotationEffect.h>
#include <DOM/Animation/ISequence.h>
#include <DOM/Animation/ITiming.h>
#include <DOM/IAnimationTimeLine.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <system/object_ext.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace Aspose::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>(u"rotation.pptx");
auto effect = presentation->get_Slide(0)->get_Timeline()->get_MainSequence()->idx_get(0);

auto rotation = ExplicitCast<IRotationEffect>(effect->get_Behaviors()->idx_get(0));
rotation->get_Timing()->set_Duration(2.0f);
rotation->get_Timing()->set_TriggerDelayTime(0.5f);
rotation->get_Timing()->set_RepeatCount(3.0f);
rotation->get_Timing()->set_Accelerate(0.2f);
rotation->get_Timing()->set_Decelerate(0.2f);

presentation->Save(u"timing.pptx", SaveFormat::Pptx);

presentation->Dispose();

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

Άλλες πολιτικές επανάληψης περιλαμβάνουν get_RepeatDuration, get_RepeatUntilEndSlide, και get_RepeatUntilNextClick. Επιλέξτε μία πολιτική αντί να τις ενεργοποιείτε όλες μαζί. Η get_AutoReverse παίζει την κίνηση ανάποδα μετά το μπροστινό πέρασμα. Η επιτάχυνση και η επιβράδυνση ισχύουν για συνεχή μεταβολή, όχι για διακριτές εκχωρήσεις ή εντολές.

Δημιουργία Μονοπατιού Κίνησης

Χρησιμοποιήστε το CreateMotionEffect για να δημιουργήσετε κίνηση. Οι get_From, get_To, και get_By περιγράφουν συντεταγμένες ή μετατοπίσεις βάσει ποσοστών. Για επεξεργάσιμο μονοπάτι, δημιουργήστε ένα MotionPath και αναθέστε το στο IMotionEffect::get_Path. Η IMotionPath αποθηκεύει τις εντολές του μονοπατιού.

MotionCommandPathType επιλέγει τη λειτουργία:

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

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

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

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

Δημιουργήστε μια συμπεριφορά κίνησης με σημείο έναρξης, ένα ευθύ τμήμα και μία εντολή τερματισμού. Η IMotionPath::Add λαμβάνει τον τύπο εντολής, τα σημεία του, τον τύπο σημείου και μια σημαία σχετικής συντεταγμένης.

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

#include <DOM/Animation/BehaviorFactory.h>
#include <DOM/Animation/EffectSubtype.h>
#include <DOM/Animation/EffectTriggerType.h>
#include <DOM/Animation/EffectType.h>
#include <DOM/Animation/IBehaviorCollection.h>
#include <DOM/Animation/IEffect.h>
#include <DOM/Animation/IMotionCmdPath.h>
#include <DOM/Animation/IMotionEffect.h>
#include <DOM/Animation/IMotionPath.h>
#include <DOM/Animation/ISequence.h>
#include <DOM/Animation/ITiming.h>
#include <DOM/Animation/MotionCommandPathType.h>
#include <DOM/Animation/MotionOriginType.h>
#include <DOM/Animation/MotionPath.h>
#include <DOM/Animation/MotionPathPointsType.h>
#include <DOM/IAnimationTimeLine.h>
#include <DOM/IAutoShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/ShapeType.h>
#include <Export/SaveFormat.h>
#include <drawing/point_f.h>
#include <system/array.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace Aspose::Slides::Export;
using namespace System;
using namespace System::Drawing;

auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);

auto shape = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 100, 100, 160, 80);

auto effect = slide->get_Timeline()->get_MainSequence()->AddEffect(shape, EffectType::PathRight, EffectSubtype::None, EffectTriggerType::OnClick);
effect->get_Behaviors()->Clear();

auto factory = MakeObject<BehaviorFactory>();
auto motion = factory->CreateMotionEffect();
motion->set_Origin(MotionOriginType::Layout);
motion->get_Timing()->set_Duration(2.0f);

auto path = MakeObject<MotionPath>();
auto startPoints = MakeArray<PointF>({ PointF(0, 0) });
path->Add(MotionCommandPathType::MoveTo, startPoints, MotionPathPointsType::Auto, false);
auto linePoints = MakeArray<PointF>({ PointF(0.25f, 0) });
path->Add(MotionCommandPathType::LineTo, linePoints, MotionPathPointsType::Corner, false);
auto endPoints = MakeArray<PointF>(0);
path->Add(MotionCommandPathType::End, endPoints, MotionPathPointsType::None, false);

motion->set_Path(path);
effect->get_Behaviors()->Add(motion);

presentation->Save(u"motion.pptx", SaveFormat::Pptx);

presentation->Dispose();

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

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

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

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

#include <DOM/Animation/IMotionCmdPath.h>
#include <DOM/Animation/IMotionPath.h>
#include <DOM/Animation/MotionCommandPathType.h>
#include <DOM/Animation/MotionPath.h>
#include <DOM/Animation/MotionPathPointsType.h>
#include <drawing/point_f.h>
#include <system/array.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace System;
using namespace System::Drawing;

auto absolutePath = MakeObject<MotionPath>();
auto startPoints = MakeArray<PointF>({ PointF(0.2f, 0) });
absolutePath->Add(MotionCommandPathType::MoveTo, startPoints, MotionPathPointsType::Auto, false);
auto absoluteEndPoints = MakeArray<PointF>({ PointF(0.3f, 0.1f) });
absolutePath->Add(MotionCommandPathType::LineTo, absoluteEndPoints, MotionPathPointsType::Corner, false);

auto relativePath = MakeObject<MotionPath>();
auto relativeStartPoints = MakeArray<PointF>({ PointF(0.2f, 0) });
relativePath->Add(MotionCommandPathType::MoveTo, relativeStartPoints, MotionPathPointsType::Auto, false);
auto relativeOffsets = MakeArray<PointF>({ PointF(0.1f, 0.1f) });
relativePath->Add(MotionCommandPathType::LineTo, relativeOffsets, MotionPathPointsType::Corner, true);

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

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

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

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

#include <DOM/Animation/IBehaviorCollection.h>
#include <DOM/Animation/IEffect.h>
#include <DOM/Animation/IMotionCmdPath.h>
#include <DOM/Animation/IMotionEffect.h>
#include <DOM/Animation/IMotionPath.h>
#include <DOM/Animation/ISequence.h>
#include <DOM/Animation/MotionCommandPathType.h>
#include <DOM/Animation/MotionPathPointsType.h>
#include <DOM/IAnimationTimeLine.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <drawing/point_f.h>
#include <system/array.h>
#include <system/object_ext.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace Aspose::Slides::Export;
using namespace System;
using namespace System::Drawing;

auto presentation = MakeObject<Presentation>(u"motion.pptx");
auto effect = presentation->get_Slide(0)->get_Timeline()->get_MainSequence()->idx_get(0);
auto motion = ExplicitCast<IMotionEffect>(effect->get_Behaviors()->idx_get(0));

auto path = motion->get_Path();
path->idx_get(1)->set_CommandType(MotionCommandPathType::CurveTo);
path->idx_get(1)->set_PointsType(MotionPathPointsType::CurveSmooth);
auto curvePoints = MakeArray<PointF>({ PointF(0.1f, 0), PointF(0.2f, 0.1f), PointF(0.3f, 0.1f) });
path->idx_get(1)->set_Points(curvePoints);

presentation->Save(u"curve.pptx", SaveFormat::Pptx);

presentation->Dispose();

Το μονοπάτι στο curve.pptx διατηρεί τρεις εντολές· η μεσαία εντολή τώρα ορίζει μια καμπύλη.

Επιθεώρηση και Επεξεργασία Αποθηκευμένου Μονοπατιού

Κάθε IMotionCmdPath εκθέτει τα get_Points, get_CommandType, get_PointsType, και get_IsRelative. Τα παρακάτω παραδείγματα χρησιμοποιούν το γνωστό μονοπάτι τριών εντολών στο motion.pptx. Για αυθαίρετη είσοδο, εντοπίστε το επιθυμητό εφέ και ελέγξτε τους τύπους εντολών και τον αριθμό σημείων πριν την επεξεργασία με δείκτη.

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

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

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

#include <DOM/Animation/IBehaviorCollection.h>
#include <DOM/Animation/IEffect.h>
#include <DOM/Animation/IMotionCmdPath.h>
#include <DOM/Animation/IMotionEffect.h>
#include <DOM/Animation/IMotionPath.h>
#include <DOM/Animation/ISequence.h>
#include <DOM/Animation/MotionCommandPathType.h>
#include <DOM/IAnimationTimeLine.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <drawing/point_f.h>
#include <system/array.h>
#include <system/console.h>
#include <system/object_ext.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace System;

auto presentation = MakeObject<Presentation>(u"motion.pptx");
auto effect = presentation->get_Slide(0)->get_Timeline()->get_MainSequence()->idx_get(0);
auto motion = ExplicitCast<IMotionEffect>(effect->get_Behaviors()->idx_get(0));

auto path = motion->get_Path();
for (auto segment : path)
{
    Console::WriteLine(u"{0}, relative: {1}", segment->get_CommandType(), segment->get_IsRelative());
    if (segment->get_Points() != nullptr)
        for (auto point : segment->get_Points())
            Console::WriteLine(u"X={0}, Y={1}", point.get_X(), point.get_Y());
}

presentation->Dispose();

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

Αλλαγή Άκρου

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

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

#include <DOM/Animation/IBehaviorCollection.h>
#include <DOM/Animation/IEffect.h>
#include <DOM/Animation/IMotionCmdPath.h>
#include <DOM/Animation/IMotionEffect.h>
#include <DOM/Animation/IMotionPath.h>
#include <DOM/Animation/ISequence.h>
#include <DOM/IAnimationTimeLine.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <drawing/point_f.h>
#include <system/array.h>
#include <system/object_ext.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace Aspose::Slides::Export;
using namespace System;
using namespace System::Drawing;

auto presentation = MakeObject<Presentation>(u"motion.pptx");
auto effect = presentation->get_Slide(0)->get_Timeline()->get_MainSequence()->idx_get(0);

auto motion = ExplicitCast<IMotionEffect>(effect->get_Behaviors()->idx_get(0));
auto endpointPoints = MakeArray<PointF>({ PointF(0.4f, 0.1f) });
motion->get_Path()->idx_get(1)->set_Points(endpointPoints);

presentation->Save(u"motion-endpoint.pptx", SaveFormat::Pptx);

presentation->Dispose();

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

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

Χρησιμοποιήστε τις μεθόδους Insert και RemoveAt για να αντικαταστήσετε τη γραμμή στο motion.pptx. Η εισαγωγή μετατοπίζει την παλιά γραμμή στο δείκτη 2.

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

#include <DOM/Animation/IBehaviorCollection.h>
#include <DOM/Animation/IEffect.h>
#include <DOM/Animation/IMotionCmdPath.h>
#include <DOM/Animation/IMotionEffect.h>
#include <DOM/Animation/IMotionPath.h>
#include <DOM/Animation/ISequence.h>
#include <DOM/Animation/MotionCommandPathType.h>
#include <DOM/Animation/MotionPathPointsType.h>
#include <DOM/IAnimationTimeLine.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <drawing/point_f.h>
#include <system/array.h>
#include <system/object_ext.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace Aspose::Slides::Export;
using namespace System;
using namespace System::Drawing;

auto presentation = MakeObject<Presentation>(u"motion.pptx");
auto effect = presentation->get_Slide(0)->get_Timeline()->get_MainSequence()->idx_get(0);
auto motion = ExplicitCast<IMotionEffect>(effect->get_Behaviors()->idx_get(0));

auto path = motion->get_Path();
auto linePoints = MakeArray<PointF>({ PointF(0.2f, 0.1f) });
path->Insert(1, MotionCommandPathType::LineTo, linePoints, MotionPathPointsType::Corner, false);
path->RemoveAt(2);

presentation->Save(u"motion-edited.pptx", SaveFormat::Pptx);

presentation->Dispose();

Το αποθηκευμένο μονοπάτι διατηρεί τρεις εντολές, με τη νέα γραμμή να τελειώνει στο (0.2, 0.1) και την εντολή τερματισμού στο τέλος.

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

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

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

#include <DOM/Animation/IBehaviorCollection.h>
#include <DOM/Animation/IEffect.h>
#include <DOM/Animation/IRotationEffect.h>
#include <DOM/Animation/ISequence.h>
#include <DOM/IAnimationTimeLine.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <cmath>
#include <system/console.h>
#include <system/object_ext.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Animation;
using namespace Aspose::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>(u"rotation.pptx");
auto effect = presentation->get_Slide(0)->get_Timeline()->get_MainSequence()->idx_get(0);

for (auto behavior : effect->get_Behaviors())
{
    auto rotation = DynamicCast<IRotationEffect>(behavior);
    if (rotation != nullptr)
        rotation->set_By(180.0f);
}

presentation->Save(u"rotation-edited.pptx", SaveFormat::Pptx);

auto reopened = MakeObject<Presentation>(u"rotation-edited.pptx");
auto savedEffect = reopened->get_Slide(0)->get_Timeline()->get_MainSequence()->idx_get(0);

for (auto behavior : savedEffect->get_Behaviors())
{
    auto rotation = DynamicCast<IRotationEffect>(behavior);
    if (rotation != nullptr)
        Console::WriteLine(u"Rotation preserved: {0}", std::abs(rotation->get_By() - 180.0f) < 0.001f);
}

presentation->Dispose();
reopened->Dispose();

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

Σειρά Συμπεριφορών, Presets και Αναπαραγωγή

Η σειρά στο IBehaviorCollection είναι η αποθηκευμένη σειρά των λειτουργιών ενός εφέ. Δεν είναι λίστα αναπαραγωγής στην οποία κάθε συμπεριφορά περιμένει αυτόματα την προηγούμενη. Το χρονοδιάστημα και το περιβάλλον εφέ καθορίζουν τον προγραμματισμό. Οι συμπεριφορές μπορούν να επικαλύπτονται και οι λειτουργίες στο ίδιο χαρακτηριστικό μπορεί να αλληλεπιδρούν μέσω των get_Additive και get_Accumulate. Μην χρησιμοποιείτε μόνο την επαναταξινόμηση της συλλογής για τον προγραμματισμό “μετακίνηση, μετά περιστροφή”· χρησιμοποιήστε ρητό χρονοδιάστημα ή ξεχωριστά εφέ όπως περιγράφεται στις Κίνηση Σχήματος.

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

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

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

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

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

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

Η δημιουργία ενός προεγκατεστημένου εφέ μπορεί να δημιουργήσει τις υποκείμενες λειτουργίες του. Ελέγξτε τις πριν αποφασίσετε αν θα επεκτείνετε το preset ή θα αντικαταστήσετε τις συμπεριφορές του.

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

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

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

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

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

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