Použít animace tvarů v prezentacích pomocí C++

Úvod

Animace jsou vizuální efekty, které lze použít na texty, obrázky, tvary nebo grafy. Dodávají život prezentacím nebo jejich částem.

Proč používat animace v prezentacích?

Používáním animací můžete

  • ovládat tok informací
  • zdůraznit důležité body
  • zvýšit zájem či zapojení publika
  • usnadnit čtení, vstřebání nebo zpracování obsahu
  • upoutat pozornost čtenářů nebo diváků na důležité části v prezentaci

PowerPoint poskytuje mnoho možností a nástrojů pro animace a animační efekty v kategoriích vstup, odchod, zdůraznění a cesty pohybu.

Animace v Aspose.Slides

  • Aspose.Slides poskytuje třídy a typy, které potřebujete pro práci s animacemi v namespace Aspose.Slides.Animation,
  • Aspose.Slides poskytuje více než 150 animačních efektů v enumeraci EffectType. Tyto efekty jsou v podstatě stejné (nebo ekvivalentní) efekty používané v PowerPointu.

Použít animaci na TextBox

Aspose.Slides pro C++ vám umožňuje použít animaci na text ve tvaru.

  1. Vytvořte instanci třídy Presentation.
  2. Získejte odkaz na snímek podle jeho indexu.
  3. Přidejte rectangle IAutoShape.
  4. Přidejte text do IAutoShape.TextFrame.
  5. Získejte hlavní sekvenci efektů.
  6. Přidejte animační efekt do IAutoShape.
  7. Nastavte vlastnost TextAnimation.BuildType na hodnotu z BuildType Enumeration.
  8. Uložte prezentaci na disk ve formátu PPTX.

Tento C++ kód ukazuje, jak použít efekt Fade na AutoShape a nastavit animaci textu na hodnotu By 1st Level Paragraphs:

 // Vytvoří instanci třídy prezentace, která představuje soubor prezentace.
 System::SharedPtr<Presentation> pres = System::MakeObject<Presentation>();

 System::SharedPtr<ISlide> sld = pres->get_Slides()->idx_get(0);

 // Přidá nový AutoShape s textem
 System::SharedPtr<IAutoShape> autoShape =
     sld->get_Shapes()->AddAutoShape(Aspose::Slides::ShapeType::Rectangle, 20.0f, 20.0f, 150.0f, 100.0f);

 System::SharedPtr<ITextFrame> textFrame = autoShape->get_TextFrame();
 textFrame->set_Text(u"First paragraph \nSecond paragraph \n Third paragraph");

 // Získá hlavní sekvenci snímku.
 System::SharedPtr<ISequence> sequence = sld->get_Timeline()->get_MainSequence();

 // Přidá efekt animace Fade do tvaru
 System::SharedPtr<IEffect> effect = sequence->AddEffect(autoShape, Aspose::Slides::Animation::EffectType::Fade,
     Aspose::Slides::Animation::EffectSubtype::None, Aspose::Slides::Animation::EffectTriggerType::OnClick);

 // Animuje text tvaru podle odstavců první úrovně
 effect->get_TextAnimation()->set_BuildType(Aspose::Slides::Animation::BuildType::ByLevelParagraphs1);

 // Uloží soubor PPTX na disk
 pres->Save(path + u"AnimText_out.pptx", Aspose::Slides::Export::SaveFormat::Pptx);

Použít animaci na PictureFrame

  1. Vytvořte instanci třídy Presentation.
  2. Získejte odkaz na snímek podle jeho indexu.
  3. Přidejte nebo získejte PictureFrame na snímku.
  4. Získejte hlavní sekvenci efektů.
  5. Přidejte animační efekt do PictureFrame.
  6. Uložte prezentaci na disk ve formátu PPTX.
// Vytvoří instanci třídy prezentace, která představuje soubor prezentace.
System::SharedPtr<Presentation> pres = System::MakeObject<Presentation>();

// Načte obrázek, který má být přidán do kolekce obrázků prezentace
System::SharedPtr<IImage> img = Images::FromFile(u"aspose-logo.jpg");
System::SharedPtr<IPPImage> image = pres->get_Images()->AddImage(img);

// Přidá rámeček obrázku na snímek
System::SharedPtr<IPictureFrame> picFrame =
    pres->get_Slides()->idx_get(0)->get_Shapes()->AddPictureFrame(Aspose::Slides::ShapeType::Rectangle, 50.0f, 50.0f, 100.0f, 100.0f, image);

// Získá hlavní sekvenci snímku.
System::SharedPtr<ISequence> sequence = pres->get_Slides()->idx_get(0)->get_Timeline()->get_MainSequence();

// Přidá animační efekt Fly zleva k rámečku obrázku
System::SharedPtr<IEffect> effect = sequence->AddEffect(picFrame, Aspose::Slides::Animation::EffectType::Fly,
    Aspose::Slides::Animation::EffectSubtype::Left, Aspose::Slides::Animation::EffectTriggerType::OnClick);

// Uloží soubor PPTX na disk
pres->Save(path + u"AnimImage_out.pptx", Aspose::Slides::Export::SaveFormat::Pptx);

Použít animaci na tvar

  1. Vytvořte instanci třídy Presentation.
  2. Získejte odkaz na snímek podle jeho indexu.
  3. Přidejte rectangle IAutoShape.
  4. Přidejte Bevel IAutoShape (když je tento objekt kliknut, animace se spustí).
  5. Vytvořte sekvenci efektů na tvaru bevel.
  6. Vytvořte vlastní UserPath.
  7. Přidejte příkazy pro přesun na UserPath.
  8. Uložte prezentaci na disk ve formátu PPTX.
	// Cesta k adresáři dokumentů.
	const String outPath = u"../out/AnimationsOnShapes_out.pptx";
	const String templatePath = u"../templates/ConnectorLineAngle.pptx";

	// Načte prezentaci
	SharedPtr<Presentation> pres = MakeObject<Presentation>();

	// Přistupuje k prvnímu snímku
	SharedPtr<ISlide> slide = pres->get_Slides()->idx_get(0);

	// Přistupuje ke kolekci tvarů pro vybraný snímek
	SharedPtr<IShapeCollection> shapes = slide->get_Shapes();

	// Vytvoří efekt PathFootball pro existující tvar od začátku.
	SharedPtr<IAutoShape> ashp = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 150, 150, 250, 25);

	ashp->AddTextFrame(u"Animated TextBox");

	// Přidá animační efekt PathFootball
	slide->get_Timeline()->get_MainSequence()->AddEffect(ashp, EffectType::PathFootball,
		EffectSubtype::None, EffectTriggerType::AfterPrevious);

	// Vytvoří nějaký druh "tlačítka".
	SharedPtr<IAutoShape> shapeTrigger = slide->get_Shapes()->AddAutoShape(ShapeType::Bevel, 10, 10, 20, 20);

	// Vytvoří sekvenci efektů pro toto tlačítko.
	SharedPtr<ISequence> seqInter = slide->get_Timeline()->get_InteractiveSequences()->Add(shapeTrigger);
	
	 // Vytvoří vlastní uživatelskou cestu. Náš objekt bude přesunut až po kliknutí na tlačítko.
	SharedPtr<IEffect> fxUserPath = seqInter->AddEffect(ashp, EffectType::PathUser, EffectSubtype::None, EffectTriggerType::OnClick);

	// Přidá příkazy pro pohyb, protože vytvořená cesta je prázdná.
	 SharedPtr<MotionEffect> motionBhv = ExplicitCast<MotionEffect>(fxUserPath->get_Behaviors()->idx_get(0));

	// SharedPtr<PointF> point = MakeObject<PointF >(0.076, 0.59);
	 const PointF point = PointF (0.076, 0.59);
	 System::ArrayPtr<PointF> pts = System::MakeObject<System::Array<PointF>>(1, point);
	 motionBhv->get_Path()->Add(MotionCommandPathType::LineTo, pts, MotionPathPointsType::Auto, true);
	 
	 //PointF point2[1] = { -0.076, -0.59 };
	const  PointF point2 = PointF(-0.076, -0.59 );

	 System::ArrayPtr<PointF> pts2 = System::MakeObject<System::Array<PointF>>(1, point2);
	 motionBhv->get_Path()->Add(MotionCommandPathType::LineTo, pts2, MotionPathPointsType::Auto, false);
	 
	 motionBhv->get_Path()->Add(MotionCommandPathType::End, nullptr, MotionPathPointsType::Auto, false);
	 
	 //Zapíše soubor PPTX na disk
	 pres->Save(outPath, Aspose::Slides::Export::SaveFormat::Pptx);

Získat animační efekty aplikované na tvar

Níže uvedené příklady ukazují, jak použít metodu GetEffectsByShape z rozhraní ISequence k získání všech animačních efektů aplikovaných na tvar.

Příklad 1: Získat animační efekty aplikované na tvar na běžném snímku

Dříve jste se naučili, jak přidávat animační efekty do tvarů v prezentacích PowerPoint. Následující ukázkový kód ukazuje, jak získat efekty aplikované na první tvar na prvním běžném snímku v prezentaci AnimExample_out.pptx.

SharedPtr<Presentation> presentation = MakeObject<Presentation>(u"AnimExample_out.pptx");

SharedPtr<ISlide> firstSlide = presentation->get_Slide(0);

// Gets the main animation sequence of the slide.
SharedPtr<ISequence> sequence = firstSlide->get_Timeline()->get_MainSequence();

// Gets the first shape on the first slide.
SharedPtr<IShape> shape = firstSlide->get_Shape(0);

// Gets animation effects applied to the shape.
ArrayPtr<SharedPtr<IEffect>> shapeEffects = sequence->GetEffectsByShape(shape);

if (shapeEffects->get_Length() > 0)
{
    Console::WriteLine(u"The shape " + shape->get_Name() + u" has " + shapeEffects->get_Length() + u" animation effects.");
}

presentation->Dispose();

Příklad 2: Získat všechny animační efekty, včetně těch zděděných z placeholderů

Pokud má tvar na běžném snímku placeholdery, které jsou na snímku rozvržení a/nebo hlavním snímku, a na tyto placeholdery byly přidány animační efekty, pak budou během prezentace přehrány všechny efekty tvaru, včetně těch zděděných z placeholderů.

Řekněme, že máme soubor prezentace PowerPoint sample.pptx s jedním snímkem obsahujícím pouze tvar zápatí s textem “Made with Aspose.Slides” a na tento tvar je aplikován efekt Random Bars.

Slide shape animation effect

Předpokládejme také, že efekt Split je aplikován na placeholder zápatí na snímku layout.

Layout shape animation effect

A nakonec je na placeholder zápatí na snímku master aplikován efekt Fly In.

Master shape animation effect

Následující ukázkový kód ukazuje, jak použít metodu GetBasePlaceholder z rozhraní IShape k přístupu k placeholderům tvaru a získání animačních efektů aplikovaných na tvar zápatí, včetně těch zděděných z placeholderů umístěných na snímcích layout a master.

void PrintEffects(ArrayPtr<SharedPtr<IEffect>> effects)
{
    for (SharedPtr<IEffect> effect : effects)
    {
        Console::WriteLine(String::Format(u"Type: {0}, subtype: {1}", effect->get_Type(), effect->get_Subtype()));
    }
}
SharedPtr<Presentation> presentation = MakeObject<Presentation>(u"sample.pptx");

SharedPtr<ISlide> slide = presentation->get_Slide(0);

// Get animation effects of the shape on the normal slide.
SharedPtr<IShape> shape = slide->get_Shape(0);
ArrayPtr<SharedPtr<IEffect>> shapeEffects = slide->get_Timeline()->get_MainSequence()->GetEffectsByShape(shape);

// Get animation effects of the placeholder on the layout slide.
SharedPtr<IShape> layoutShape = shape->GetBasePlaceholder();
ArrayPtr<SharedPtr<IEffect>> layoutShapeEffects = slide->get_LayoutSlide()->get_Timeline()->get_MainSequence()->GetEffectsByShape(layoutShape);

// Get animation effects of the placeholder on the master slide.
SharedPtr<IShape> masterShape = layoutShape->GetBasePlaceholder();
ArrayPtr<SharedPtr<IEffect>> masterShapeEffects = slide->get_LayoutSlide()->get_MasterSlide()->get_Timeline()->get_MainSequence()->GetEffectsByShape(masterShape);

presentation->Dispose();

Console::WriteLine(u"Main sequence of shape effects:");
PrintEffects(masterShapeEffects);
PrintEffects(layoutShapeEffects);
PrintEffects(shapeEffects);
Main sequence of shape effects:
Type: 47, subtype: 2              // Prolet, Dole
Type: 134, subtype: 45            // Rozdělení, Svisle dovnitř
Type: 126, subtype: 22            // Náhodné pruhy, Horizontální

Změnit časové vlastnosti animačního efektu

Aspose.Slides pro C++ vám umožňuje změnit časové vlastnosti animačního efektu.

This is the Animation Timing pane in Microsoft PowerPoint:

example1_image

Jedná se o odpovídající položky mezi časováním v PowerPointu a vlastnostmi Effect.Timing :

Takto změníte vlastnosti časování efektu:

  1. Použít nebo získat animační efekt.
  2. Nastavte nové hodnoty požadovaných vlastností Effect.Timing.
  3. Uložte upravený soubor PPTX.
// Vytvoří instanci třídy prezentace, která představuje soubor prezentace.
System::SharedPtr<Presentation> pres = System::MakeObject<Presentation>(u"AnimExample_out.pptx");

// Získá hlavní sekvenci snímku.
System::SharedPtr<ISequence> sequence = pres->get_Slides()->idx_get(0)->get_Timeline()->get_MainSequence();

// Získá první efekt hlavní sekvence.
System::SharedPtr<IEffect> effect = sequence->idx_get(0);

// Změní TriggerType efektu tak, aby se spustil kliknutím
effect->get_Timing()->set_TriggerType(Aspose::Slides::Animation::EffectTriggerType::OnClick);

// Změní délku trvání efektu
effect->get_Timing()->set_Duration(3.f);

// Změní TriggerDelayTime efektu
effect->get_Timing()->set_TriggerDelayTime(0.5f);

// Uloží soubor PPTX na disk
pres->Save(u"AnimExample_changed.pptx", Aspose::Slides::Export::SaveFormat::Pptx);

Zvuk animačního efektu

Aspose.Slides poskytuje následující vlastnosti, které umožňují práci se zvuky v animačních efektech:

Přidat zvuk animačního efektu

Tento C++ kód ukazuje, jak přidat zvuk animačního efektu a zastavit jej, když začne další efekt:

System::SharedPtr<Presentation> pres = System::MakeObject<Presentation>(u"AnimExample_out.pptx");

// Přidá zvuk do kolekce audio souborů prezentace
System::SharedPtr<IAudio> effectSound = pres->get_Audios()->AddAudio(System::IO::File::ReadAllBytes(u"sampleaudio.wav"));
System::SharedPtr<ISlide> firstSlide = pres->get_Slide(0);

// Získá hlavní sekvenci snímku.
System::SharedPtr<ISequence> sequence = firstSlide->get_Timeline()->get_MainSequence();

// Získá první efekt hlavní sekvence
System::SharedPtr<IEffect> firstEffect = sequence->idx_get(0);

// Kontroluje, zda efekt nemá žádný zvuk
if (!firstEffect->get_StopPreviousSound() && firstEffect->get_Sound() == nullptr)
{
    // Přidá zvuk k prvnímu efektu
    firstEffect->set_Sound(effectSound);
}

// Získá první interaktivní sekvenci snímku.
System::SharedPtr<ISequence> interactiveSequence = firstSlide->get_Timeline()->get_InteractiveSequence(0);

// Nastaví příznak efektu "Stop previous sound"
interactiveSequence->idx_get(0)->set_StopPreviousSound(true);

// Zapíše soubor PPTX na disk
pres->Save(u"AnimExample_Sound_out.pptx", SaveFormat::Pptx);

Extrahovat zvuk animačního efektu

  1. Vytvořte instanci třídy Presentation.
  2. Získejte odkaz na snímek podle jeho indexu.
  3. Získejte hlavní sekvenci efektů.
  4. Extrahujte vložený set_Sound() z každého animačního efektu.

Tento C++ kód ukazuje, jak extrahovat zvuk vložený do animačního efektu:

// Vytvoří instanci třídy prezentace, která představuje soubor prezentace.
System::SharedPtr<Presentation> pres = System::MakeObject<Presentation>(u"EffectSound.pptx");
System::SharedPtr<ISlide> slide = pres->get_Slide(0);

// Získá hlavní sekvenci snímku.
System::SharedPtr<ISequence> sequence = slide->get_Timeline()->get_MainSequence();

for (auto&& effect : sequence)
{
    System::SharedPtr<IAudio> sound = effect->get_Sound();

    if (sound == nullptr)
        continue;

    auto audio = sound->get_BinaryData();
}

Po animaci

Aspose.Slides pro C++ vám umožňuje změnit vlastnost After animation (Po animaci) animačního efektu.

This is the Animation Effect pane and extended menu in Microsoft PowerPoint:

example1_image

Rozbalovací seznam After animation v PowerPointu odpovídá těmto vlastnostem:

// Vytvoří instanci třídy prezentace, která představuje soubor prezentace
System::SharedPtr<Presentation> pres = System::MakeObject<Presentation>(u"AnimImage_out.pptx");
System::SharedPtr<ISlide> firstSlide = pres->get_Slide(0);

// Získá první efekt hlavní sekvence
System::SharedPtr<IEffect> firstEffect = firstSlide->get_Timeline()->get_MainSequence()->idx_get(0);

// Změní typ po animaci na Color
firstEffect->set_AfterAnimationType(AfterAnimationType::Color);

// Nastaví barvu po animaci
firstEffect->get_AfterAnimationColor()->set_Color(System::Drawing::Color::get_AliceBlue());

// Zapíše soubor PPTX na disk
pres->Save(u"AnimImage_AfterAnimation.pptx", SaveFormat::Pptx);

Animovat text

Aspose.Slides poskytuje následující vlastnosti, které umožňují práci s blokem Animate text animačního efektu:

Takto můžete změnit vlastnosti Effect Animate text:

  1. Použít nebo získat animační efekt.
  2. Nastavte vlastnost set_BuildType() na hodnotu BuildType.AsOneObject , čímž vypnete režim animace By Paragraphs.
  3. Nastavte nové hodnoty pro vlastnosti set_AnimateTextType() a set_DelayBetweenTextParts().
  4. Uložte upravený soubor PPTX.
// Vytvoří instanci třídy prezentace, která představuje soubor prezentace.
System::SharedPtr<Presentation> pres = System::MakeObject<Presentation>(u"AnimTextBox_out.pptx");
System::SharedPtr<ISlide> firstSlide = pres->get_Slide(0);

// Získá první efekt hlavní sekvence
System::SharedPtr<IEffect> firstEffect = firstSlide->get_Timeline()->get_MainSequence()->idx_get(0);

// Změní typ textové animace efektu na "As One Object"
firstEffect->get_TextAnimation()->set_BuildType(BuildType::AsOneObject);

// Změní typ animovaného textu efektu na "By word"
firstEffect->set_AnimateTextType(AnimateTextType::ByWord);

// Nastaví prodlevu mezi slovy na 20% trvání efektu
firstEffect->set_DelayBetweenTextParts(20.0f);

// Zapíše soubor PPTX na disk
pres->Save(u"AnimTextBox_AnimateText.pptx", SaveFormat::Pptx);

Často kladené dotazy

Jak mohu zajistit, že animace zůstanou zachovány při publikování prezentace na web?

Export to HTML5 a povolte options zodpovědné za animace shape a transition. Prostý HTML animace snímků nepřehraje, zatímco HTML5 ano.

Jak ovlivňuje změna z-order (pořadí vrstev) tvarů animaci?

Animace a pořadí vykreslování jsou nezávislé: efekt řídí časování a typ objevování/zmizení, zatímco z-order určuje, co co překrývá. Viditelný výsledek je definován jejich kombinací. (Toto je obecné chování PowerPointu; model efektů a tvarů Aspose.Slides následuje stejnou logiku.)

Existují omezení při konverzi animací do videa u některých efektů?

Obecně jsou animace podporovány, ale v ojedinělých případech nebo u specifických efektů může dojít k odlišnému vykreslení. Doporučuje se otestovat s efekty, které používáte, a s verzí knihovny.