Zastosuj animacje kształtów w prezentacjach przy użyciu C++

Wprowadzenie

Animacje są efektami wizualnymi, które można zastosować do tekstów, obrazów, kształtów lub wykresów. Ożywiają prezentacje lub ich elementy.

Dlaczego używać animacji w prezentacjach?

Korzystając z animacji, możesz

  • kontrolować przepływ informacji
  • wyeksponować ważne punkty
  • zwiększyć zainteresowanie lub zaangażowanie odbiorców
  • uczynić treść łatwiejszą do czytania, przyswajania lub przetwarzania
  • przyciągnąć uwagę czytelników lub widzów na ważne części w prezentacji

PowerPoint udostępnia wiele opcji i narzędzi do animacji oraz efektów animacji w kategoriach wejścia, wyjścia, akcentu i ścieżek ruchu.

Animacje w Aspose.Slides

  • Aspose.Slides udostępnia klasy i typy potrzebne do pracy z animacjami w przestrzeni nazw Aspose.Slides.Animation.
  • Aspose.Slides oferuje ponad 150 efektów animacji w wyliczeniu EffectType. Efekty te są zasadniczo takie same (lub równoważne) jak te używane w PowerPoint.

Zastosuj animację do pola tekstowego

Aspose.Slides dla C++ pozwala zastosować animację do tekstu w kształcie.

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odniesienie do slajdu poprzez jego indeks.
  3. Dodaj rectangle IAutoShape.
  4. Dodaj tekst do IAutoShape.TextFrame.
  5. Uzyskaj główną sekwencję efektów.
  6. Dodaj efekt animacji do IAutoShape.
  7. Ustaw właściwość TextAnimation.BuildType na wartość z wyliczenia BuildType.
  8. Zapisz prezentację na dysku jako plik PPTX.

Ten kod C++ pokazuje, jak zastosować efekt Fade do AutoShape oraz ustawić animację tekstu na wartość By 1st Level Paragraphs:

// Tworzy instancję klasy prezentacji, która reprezentuje plik prezentacji.
System::SharedPtr<Presentation> pres = System::MakeObject<Presentation>();

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

// Dodaje nową AutoShape z tekstem
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");

// Pobiera główną sekwencję slajdu.
System::SharedPtr<ISequence> sequence = sld->get_Timeline()->get_MainSequence();

// Dodaje efekt animacji Fade do kształtu
System::SharedPtr<IEffect> effect = sequence->AddEffect(autoShape, Aspose::Slides::Animation::EffectType::Fade,
    Aspose::Slides::Animation::EffectSubtype::None, Aspose::Slides::Animation::EffectTriggerType::OnClick);

// Animuje tekst kształtu według akapitów pierwszego poziomu
effect->get_TextAnimation()->set_BuildType(Aspose::Slides::Animation::BuildType::ByLevelParagraphs1);

// Zapisuje plik PPTX na dysku
pres->Save(path + u"AnimText_out.pptx", Aspose::Slides::Export::SaveFormat::Pptx);

Zastosuj animację do ramki obrazu

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odniesienie do slajdu poprzez jego indeks.
  3. Dodaj lub pobierz PictureFrame na slajdzie.
  4. Uzyskaj główną sekwencję efektów.
  5. Dodaj efekt animacji do PictureFrame.
  6. Zapisz prezentację na dysku jako plik PPTX.

Ten kod C++ pokazuje, jak zastosować efekt Fly do ramki obrazu:

// Tworzy instancję klasy prezentacji, która reprezentuje plik prezentacji.
System::SharedPtr<Presentation> pres = System::MakeObject<Presentation>();

// Ładuje obraz, który zostanie dodany do kolekcji obrazów w prezentacji
System::SharedPtr<IImage> img = Images::FromFile(u"aspose-logo.jpg");
System::SharedPtr<IPPImage> image = pres->get_Images()->AddImage(img);

// Dodaje ramkę obrazu do slajdu
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);

// Pobiera główną sekwencję slajdu.
System::SharedPtr<ISequence> sequence = pres->get_Slides()->idx_get(0)->get_Timeline()->get_MainSequence();

// Dodaje efekt animacji Fly z lewej do ramki obrazu
System::SharedPtr<IEffect> effect = sequence->AddEffect(picFrame, Aspose::Slides::Animation::EffectType::Fly,
    Aspose::Slides::Animation::EffectSubtype::Left, Aspose::Slides::Animation::EffectTriggerType::OnClick);

// Zapisuje plik PPTX na dysku
pres->Save(path + u"AnimImage_out.pptx", Aspose::Slides::Export::SaveFormat::Pptx);

Zastosuj animację do kształtu

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odniesienie do slajdu poprzez jego indeks.
  3. Dodaj rectangle IAutoShape.
  4. Dodaj Bevel IAutoShape. (gdy ten obiekt zostanie kliknięty, animacja zostanie odtworzona).
  5. Utwórz sekwencję efektów na kształcie bevel.
  6. Utwórz własny UserPath.
  7. Dodaj polecenia do przemieszczania się po UserPath.
  8. Zapisz prezentację na dysku jako plik PPTX.

Ten kod C++ pokazuje, jak zastosować efekt PathFootball (path football) do kształtu:

	// Ścieżka do katalogu dokumentów.
	const String outPath = u"../out/AnimationsOnShapes_out.pptx";
	const String templatePath = u"../templates/ConnectorLineAngle.pptx";

	// Wczytuje prezentację
	SharedPtr<Presentation> pres = MakeObject<Presentation>();

	// Uzyskuje dostęp do pierwszego slajdu
	SharedPtr<ISlide> slide = pres->get_Slides()->idx_get(0);

	// Uzyskuje dostęp do kolekcji kształtów wybranego slajdu
	SharedPtr<IShapeCollection> shapes = slide->get_Shapes();

	// Tworzy efekt PathFootball dla istniejącego kształtu od podstaw.
	SharedPtr<IAutoShape> ashp = slide->get_Shapes()->AddAutoShape(ShapeType::Rectangle, 150, 150, 250, 25);

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

	// Dodaje efekt animacji PathFootball
	slide->get_Timeline()->get_MainSequence()->AddEffect(ashp, EffectType::PathFootball,
		EffectSubtype::None, EffectTriggerType::AfterPrevious);

	// Tworzy pewnego rodzaju "przycisk".
	SharedPtr<IAutoShape> shapeTrigger = slide->get_Shapes()->AddAutoShape(ShapeType::Bevel, 10, 10, 20, 20);

	// Tworzy sekwencję efektów dla tego przycisku.
	SharedPtr<ISequence> seqInter = slide->get_Timeline()->get_InteractiveSequences()->Add(shapeTrigger);
	
	 // Tworzy niestandardową ścieżkę użytkownika. Nasz obiekt zostanie przesunięty dopiero po kliknięciu przycisku.
	SharedPtr<IEffect> fxUserPath = seqInter->AddEffect(ashp, EffectType::PathUser, EffectSubtype::None, EffectTriggerType::OnClick);

	// Dodaje polecenia ruchu, ponieważ utworzona ścieżka jest pusta.
	 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);
	 
	 // Zapisuje plik PPTX na dysk
	 pres->Save(outPath, Aspose::Slides::Export::SaveFormat::Pptx);

Pobierz efekty animacji zastosowane do kształtu

Poniższe przykłady pokazują, jak używać metody GetEffectsByShape z interfejsu ISequence aby uzyskać wszystkie efekty animacji zastosowane do kształtu.

Przykład 1: Pobierz efekty animacji zastosowane do kształtu na normalnym slajdzie

Wcześniej nauczyłeś się, jak dodawać efekty animacji do kształtów w prezentacjach PowerPoint. Poniższy przykładowy kod pokazuje, jak uzyskać efekty zastosowane do pierwszego kształtu na pierwszym normalnym slajdzie w prezentacji 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();

Przykład 2: Pobierz wszystkie efekty animacji, w tym te dziedziczone z placeholderów

Jeśli kształt na normalnym slajdzie ma placeholdery znajdujące się na slajdzie układu i/lub slajdzie głównym, a do tych placeholderów dodano efekty animacji, wszystkie efekty kształtu będą odtwarzane podczas pokazu slajdów, w tym te dziedziczone z placeholderów.

Powiedzmy, że mamy plik prezentacji PowerPoint sample.pptx z jednym slajdem zawierającym jedynie kształt stopki z tekstem „Made with Aspose.Slides” i zastosowano do niego efekt Random Bars.

Efekt animacji kształtu slajdu

Załóżmy również, że efekt Split został zastosowany do placeholdera stopki na slajdzie układu.

Efekt animacji kształtu układu

I w końcu, efekt Fly In został zastosowany do placeholdera stopki na slajdzie nadrzędnym.

Efekt animacji kształtu nadrzędnego

Poniższy przykładowy kod pokazuje, jak używać metody GetBasePlaceholder z interfejsu IShape aby uzyskać dostęp do placeholderów kształtu i pobrać efekty animacji zastosowane do kształtu stopki, w tym te dziedziczone z placeholderów znajdujących się na slajdach układu i nadrzędnym.

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

Wyjście:

Main sequence of shape effects:
Type: 47, subtype: 2              // Lot, dół
Type: 134, subtype: 45            // Rozdzielenie, pionowo w środku
Type: 126, subtype: 22            // Losowe paski, poziome

Zmień właściwości timingowe efektu animacji

Aspose.Slides dla C++ pozwala zmienić właściwości Timing efektu animacji.

Panel Timing animacji w Microsoft PowerPoint:

example1_image

Odpowiedniości między Timing w PowerPoint a właściwościami Effect.Timing:

Oto jak zmienić właściwości Timing efektu:

  1. Zastosuj (Apply) lub pobierz efekt animacji.
  2. Ustaw nowe wartości dla potrzebnych właściwości Effect.Timing.
  3. Zapisz zmodyfikowany plik PPTX.
// Tworzy instancję klasy prezentacji, która reprezentuje plik prezentacji.
System::SharedPtr<Presentation> pres = System::MakeObject<Presentation>(u"AnimExample_out.pptx");

// Pobiera główną sekwencję slajdu.
System::SharedPtr<ISequence> sequence = pres->get_Slides()->idx_get(0)->get_Timeline()->get_MainSequence();

// Pobiera pierwszy efekt głównej sekwencji.
System::SharedPtr<IEffect> effect = sequence->idx_get(0);

// Zmienia TriggerType efektu na rozpoczęcie po kliknięciu
effect->get_Timing()->set_TriggerType(Aspose::Slides::Animation::EffectTriggerType::OnClick);

// Zmienia czas trwania efektu
effect->get_Timing()->set_Duration(3.f);

// Zmienia TriggerDelayTime efektu
effect->get_Timing()->set_TriggerDelayTime(0.5f);

// Zapisuje plik PPTX na dysk
pres->Save(u"AnimExample_changed.pptx", Aspose::Slides::Export::SaveFormat::Pptx);

Dźwięk efektu animacji

Aspose.Slides udostępnia następujące właściwości, które umożliwiają pracę z dźwiękami w efektach animacji:

Dodaj dźwięk efektu animacji

Ten kod C++ pokazuje, jak dodać dźwięk efektu animacji i zatrzymać go, gdy rozpocznie się kolejny efekt:

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

// Dodaje dźwięk do kolekcji audio prezentacji
System::SharedPtr<IAudio> effectSound = pres->get_Audios()->AddAudio(System::IO::File::ReadAllBytes(u"sampleaudio.wav"));
System::SharedPtr<ISlide> firstSlide = pres->get_Slide(0);

// Pobiera główną sekwencję slajdu.
System::SharedPtr<ISequence> sequence = firstSlide->get_Timeline()->get_MainSequence();

// Pobiera pierwszy efekt głównej sekwencji
System::SharedPtr<IEffect> firstEffect = sequence->idx_get(0);

// Sprawdza, czy efekt ma ustawiony brak dźwięku
if (!firstEffect->get_StopPreviousSound() && firstEffect->get_Sound() == nullptr)
{
    // Dodaje dźwięk do pierwszego efektu
    firstEffect->set_Sound(effectSound);
}

// Pobiera pierwszą interaktywną sekwencję slajdu.
System::SharedPtr<ISequence> interactiveSequence = firstSlide->get_Timeline()->get_InteractiveSequence(0);

// Ustawia flagę „Stop previous sound” dla efektu
interactiveSequence->idx_get(0)->set_StopPreviousSound(true);

// Zapisuje plik PPTX na dysk
pres->Save(u"AnimExample_Sound_out.pptx", SaveFormat::Pptx);

Wyodrębnij dźwięk efektu animacji

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odniesienie do slajdu poprzez jego indeks.
  3. Uzyskaj główną sekwencję efektów.
  4. Wyodrębnij osadzony set_Sound() z każdego efektu animacji.

Ten kod C++ pokazuje, jak wyodrębnić dźwięk osadzony w efekcie animacji:

// Tworzy instancję klasy prezentacji, która reprezentuje plik prezentacji.
System::SharedPtr<Presentation> pres = System::MakeObject<Presentation>(u"EffectSound.pptx");
System::SharedPtr<ISlide> slide = pres->get_Slide(0);

// Pobiera główną sekwencję slajdu.
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 animacji

Aspose.Slides dla C++ pozwala zmienić właściwość After animation (Po animacji) efektu animacji.

Panel efektu animacji i rozszerzone menu w Microsoft PowerPoint:

example1_image

Właściwość [set_AfterAnimationType()] opisująca typ po animacji:

Właściwość [set_AfterAnimationColor()] definiuje format koloru po animacji. Działa ona w połączeniu z typem AfterAnimationType.Color. Jeśli zmienisz typ na inny, kolor po animacji zostanie wyczyszczony.

// Tworzy instancję klasy prezentacji, która reprezentuje plik prezentacji
System::SharedPtr<Presentation> pres = System::MakeObject<Presentation>(u"AnimImage_out.pptx");
System::SharedPtr<ISlide> firstSlide = pres->get_Slide(0);

// Pobiera pierwszy efekt z głównej sekwencji
System::SharedPtr<IEffect> firstEffect = firstSlide->get_Timeline()->get_MainSequence()->idx_get(0);

// Zmienia typ animacji po zakończeniu na Color
firstEffect->set_AfterAnimationType(AfterAnimationType::Color);

// Ustawia kolor przyciemnienia po animacji
firstEffect->get_AfterAnimationColor()->set_Color(System::Drawing::Color::get_AliceBlue());

// Zapisuje plik PPTX na dysk
pres->Save(u"AnimImage_AfterAnimation.pptx", SaveFormat::Pptx);

Animuj tekst

Aspose.Slides udostępnia te właściwości, które umożliwiają pracę z blokiem Animate text efektu animacji:

Oto jak zmienić właściwości Animate text efektu:

  1. Zastosuj (Apply) lub pobierz efekt animacji.
  2. Ustaw właściwość set_BuildType() na wartość BuildType.AsOneObject, aby wyłączyć tryb animacji By Paragraphs.
  3. Ustaw nowe wartości właściwości set_AnimateTextType() i set_DelayBetweenTextParts().
  4. Zapisz zmodyfikowany plik PPTX.
// Tworzy instancję klasy prezentacji, która reprezentuje plik prezentacji.
System::SharedPtr<Presentation> pres = System::MakeObject<Presentation>(u"AnimTextBox_out.pptx");
System::SharedPtr<ISlide> firstSlide = pres->get_Slide(0);

// Pobiera pierwszy efekt z głównej sekwencji
System::SharedPtr<IEffect> firstEffect = firstSlide->get_Timeline()->get_MainSequence()->idx_get(0);

// Zmienia typ animacji tekstu efektu na „Jako jeden obiekt”
firstEffect->get_TextAnimation()->set_BuildType(BuildType::AsOneObject);

// Zmienia typ animacji tekstu efektu na „Słowo po słowie”
firstEffect->set_AnimateTextType(AnimateTextType::ByWord);

// Ustawia opóźnienie między słowami na 20% czasu trwania efektu
firstEffect->set_DelayBetweenTextParts(20.0f);

// Zapisuje plik PPTX na dysk
pres->Save(u"AnimTextBox_AnimateText.pptx", SaveFormat::Pptx);

FAQ

Jak mogę zapewnić zachowanie animacji przy publikowaniu prezentacji w sieci?

Export to HTML5 i włącz opcje odpowiedzialne za animacje kształtów i przejść. Zwykły HTML nie odtwarza animacji slajdów, natomiast HTML5 tak.

Jak zmiana kolejności warstw (z-order) kształtów wpływa na animację?

Animacja i kolejność rysowania są niezależne: efekt kontroluje moment i typ pojawiania się/zanikania, natomiast z-order określa, co co zasłania. Widoczny rezultat definiowany jest ich połączeniem. (To ogólne zachowanie PowerPoint; model efektów i kształtów Aspose.Slides podąża za tą samą logiką.)

Czy istnieją ograniczenia przy konwertowaniu animacji na wideo dla niektórych efektów?

Ogólnie animacje są obsługiwane, ale rzadkie przypadki lub specyficzne efekty mogą być renderowane inaczej. Zaleca się testować używane efekty oraz wersję biblioteki.