Aplicar Animações de Forma em Apresentações Usando Java

Introdução

Animações são efeitos visuais que podem ser aplicados a textos, imagens, formas ou gráficos. Elas dão vida às apresentações ou seus componentes.

Por que usar animações em apresentações?

Usando animações, você pode

  • controlar o fluxo de informação
  • enfatizar pontos importantes
  • aumentar o interesse ou a participação do público
  • tornar o conteúdo mais fácil de ler, assimilar ou processar
  • chamar a atenção dos leitores ou espectadores para partes importantes da apresentação

PowerPoint fornece muitas opções e ferramentas para animações e efeitos de animação nas categorias entrada, saída, ênfase e caminhos de movimento.

Animações no Aspose.Slides

  • Aspose.Slides fornece as classes e tipos necessários para trabalhar com animações no namespace Aspose.Slides.Animation,
  • Aspose.Slides oferece mais de 150 efeitos de animação na enumeração EffectType. Esses efeitos são essencialmente os mesmos (ou equivalentes) usados no PowerPoint.

Aplicar animação a uma TextBox

Aspose.Slides for Java permite aplicar animação ao texto em uma forma.

  1. Crie uma instância da classe Presentation.
  2. Obtenha uma referência de slide pelo seu índice.
  3. Adicione um rectangle IAutoShape.
  4. Adicione texto a IAutoShape.TextFrame.
  5. Obtenha a sequência principal de efeitos.
  6. Adicione um efeito de animação ao IAutoShape.
  7. Defina a propriedade TextAnimation.BuildType para o valor da enumeração BuildType.
  8. Grave a apresentação no disco como um arquivo PPTX.

Este código Java mostra como aplicar o efeito Fade ao AutoShape e definir a animação de texto para o valor By 1st Level Paragraphs:

// Instancia uma classe de apresentação que representa um arquivo de apresentação.
Presentation pres = new Presentation();
try {
    ISlide sld = pres.getSlides().get_Item(0);

    // Adiciona um novo AutoShape com texto
    IAutoShape autoShape = sld.getShapes().addAutoShape(ShapeType.Rectangle, 20, 20, 150, 100);

    ITextFrame textFrame = autoShape.getTextFrame();
    textFrame.setText("First paragraph \nSecond paragraph \n Third paragraph");

    // Obtém a sequência principal do slide.
    ISequence sequence = sld.getTimeline().getMainSequence();

    // Adiciona o efeito de animação Fade à forma
    IEffect effect = sequence.addEffect(autoShape, EffectType.Fade, EffectSubtype.None, EffectTriggerType.OnClick);

    // Anima o texto da forma por parágrafos de nível 1
    effect.getTextAnimation().setBuildType(BuildType.ByLevelParagraphs1);

    // Salva o arquivo PPTX no disco
    pres.save(path + "AnimText_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Aplicar animação a um PictureFrame

  1. Crie uma instância da classe Presentation.
  2. Obtenha a referência de um slide pelo seu índice.
  3. Adicione ou obtenha um PictureFrame no slide.
  4. Obtenha a sequência principal de efeitos.
  5. Adicione um efeito de animação ao PictureFrame.
  6. Grave a apresentação no disco como um arquivo PPTX.

Este código Java mostra como aplicar o efeito Fly a um picture frame:

// Instancia uma classe de apresentação que representa um arquivo de apresentação.
Presentation pres = new Presentation();
try {
    // Carrega a imagem a ser adicionada na coleção de imagens da apresentação
    IPPImage picture;
    IImage image = Images.fromFile("aspose-logo.jpg");
    try {
        picture = pres.getImages().addImage(image);
    } finally {
        if (image != null) image.dispose();
    }

    // Adiciona um quadro de imagem ao slide
    IPictureFrame picFrame = pres.getSlides().get_Item(0).getShapes().addPictureFrame(ShapeType.Rectangle, 50, 50, 100, 100, picture);

    // Obtém a sequência principal do slide.
    ISequence sequence = pres.getSlides().get_Item(0).getTimeline().getMainSequence();

    // Adiciona o efeito de animação Fly da esquerda ao quadro de imagem
    IEffect effect = sequence.addEffect(picFrame, EffectType.Fly, EffectSubtype.Left, EffectTriggerType.OnClick);

    // Salva o arquivo PPTX no disco
    pres.save(path + "AnimImage_out.pptx", SaveFormat.Pptx);
} catch(IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

Aplicar animação a uma Forma

  1. Crie uma instância da Presentation .
  2. Obtenha a referência de um slide pelo seu índice.
  3. Adicione um rectangle IAutoShape.
  4. Adicione um Bevel IAutoShape (quando este objeto é clicado, a animação é reproduzida).
  5. Crie uma sequência de efeitos na forma bevel.
  6. Crie um UserPath personalizado.
  7. Adicione comandos para mover ao UserPath.
  8. Grave a apresentação no disco como um arquivo PPTX.

Este código Java mostra como aplicar o efeito PathFootball (path football) a uma forma:

// Instancia uma classe Presentation que representa um arquivo PPTX.
Presentation pres = new Presentation();
try {
    ISlide sld = pres.getSlides().get_Item(0);

    // Cria o efeito PathFootball para uma forma existente do zero.
    IAutoShape ashp = sld.getShapes().addAutoShape(ShapeType.Rectangle, 150, 150, 250, 25);
    ashp.addTextFrame("Animated TextBox");

    // Adiciona o efeito de animação PathFootBall
    pres.getSlides().get_Item(0).getTimeline().getMainSequence().addEffect(ashp, EffectType.PathFootball,
            EffectSubtype.None, EffectTriggerType.AfterPrevious);

    // Cria algum tipo de "botão".
    IShape shapeTrigger = pres.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.Bevel, 10, 10, 20, 20);

    // Cria uma sequência de efeitos para este botão.
    ISequence seqInter = pres.getSlides().get_Item(0).getTimeline().getInteractiveSequences().add(shapeTrigger);

     // Cria um caminho de usuário personalizado. Nosso objeto será movido somente após o botão ser clicado.
    IEffect fxUserPath = seqInter.addEffect(ashp, EffectType.PathUser, EffectSubtype.None, EffectTriggerType.OnClick);

     // Adiciona comandos de movimento já que o caminho criado está vazio.
    IMotionEffect motionBvh = ((IMotionEffect)fxUserPath.getBehaviors().get_Item(0));

    Point2D.Float[] pts = new Point2D.Float[1];
    pts[0] = new Point2D.Float(0.076f, 0.59f);
    motionBvh.getPath().add(MotionCommandPathType.LineTo, pts, MotionPathPointsType.Auto, true);
    pts[0] = new Point2D.Float(-0.076f, -0.59f);
    motionBvh.getPath().add(MotionCommandPathType.LineTo, pts, MotionPathPointsType.Auto, false);
    motionBvh.getPath().add(MotionCommandPathType.End, null, MotionPathPointsType.Auto, false);

     // Grava o arquivo PPTX no disco
    pres.save("AnimExample_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Obter os efeitos de animação aplicados a uma forma

Os exemplos a seguir mostram como usar o método getEffectsByShape da interface ISequence para obter todos os efeitos de animação aplicados a uma forma.

Exemplo 1: Obter efeitos de animação aplicados a uma forma em um slide normal

Anteriormente, você aprendeu como adicionar efeitos de animação a formas em apresentações do PowerPoint. O código de exemplo a seguir mostra como obter os efeitos aplicados à primeira forma do primeiro slide normal da apresentação AnimExample_out.pptx.

Presentation presentation = new Presentation("AnimExample_out.pptx");
try {
    ISlide firstSlide = presentation.getSlides().get_Item(0);

    // Obtém a sequência principal de animação do slide.
    ISequence sequence = firstSlide.getTimeline().getMainSequence();

    // Obtém a primeira forma no primeiro slide.
    IShape shape = firstSlide.getShapes().get_Item(0);

    // Obtém os efeitos de animação aplicados à forma.
    IEffect[] shapeEffects = sequence.getEffectsByShape(shape);

    if (shapeEffects.length > 0)
        System.out.println("The shape " + shape.getName() + " has " + shapeEffects.length + " animation effects.");
} finally {
    if (presentation != null) presentation.dispose();
}

Exemplo 2: Obter todos os efeitos de animação, inclusive os herdados de placeholders

Se uma forma em um slide normal tem placeholders que estão no slide de layout e/ou slide mestre, e efeitos de animação foram adicionados a esses placeholders, então todos os efeitos da forma serão reproduzidos durante a apresentação, incluindo os herdados dos placeholders.

Vamos supor que temos um arquivo de apresentação PowerPoint sample.pptx com um slide contendo apenas uma forma de rodapé com o texto “Made with Aspose.Slides” e o efeito Random Bars está aplicado à forma.

Slide shape animation effect

Vamos também supor que o efeito Split está aplicado ao placeholder de rodapé no slide layout.

Layout shape animation effect

E finalmente, o efeito Fly In está aplicado ao placeholder de rodapé no slide master.

Master shape animation effect

O código de exemplo a seguir mostra como usar o método getBasePlaceholder da interface IShape para acessar os placeholders da forma e obter os efeitos de animação aplicados à forma de rodapé, inclusive os herdados dos placeholders localizados nos slides de layout e mestre.

Presentation presentation = new Presentation("sample.pptx");

ISlide slide = presentation.getSlides().get_Item(0);

// Get animation effects of the shape on the normal slide.
IShape shape = slide.getShapes().get_Item(0);
IEffect[] shapeEffects = slide.getTimeline().getMainSequence().getEffectsByShape(shape);

// Get animation effects of the placeholder on the layout slide.
IShape layoutShape = shape.getBasePlaceholder();
IEffect[] layoutShapeEffects = slide.getLayoutSlide().getTimeline().getMainSequence().getEffectsByShape(layoutShape);

// Get animation effects of the placeholder on the master slide.
IShape masterShape = layoutShape.getBasePlaceholder();
IEffect[] masterShapeEffects = slide.getLayoutSlide().getMasterSlide().getTimeline().getMainSequence().getEffectsByShape(masterShape);

System.out.println("Main sequence of shape effects:");
printEffects(masterShapeEffects);
printEffects(layoutShapeEffects);
printEffects(shapeEffects);

presentation.dispose();
static void printEffects(IEffect[] effects)
{
    for (IEffect effect : effects)
    {
        String typeName = EffectType.getName(EffectType.class, effect.getType());
        String subtypeName = EffectSubtype.getName(EffectSubtype.class, effect.getSubtype());

        System.out.println(typeName + " " + subtypeName);
    }
}

Output:

Main sequence of shape effects:
Fly Bottom
Split VerticalIn
RandomBars Horizontal

Alterar propriedades de tempo do efeito de animação

Aspose.Slides for Java permite alterar as propriedades de tempo de um efeito de animação.

Esta é o painel de Animation Timing no Microsoft PowerPoint:

example1_image

Estas são as correspondências entre PowerPoint Timing e propriedades Effect.Timing:

É assim que você altera as propriedades de tempo do efeito:

  1. Aplicar ou obter o efeito de animação.
  2. Defina novos valores para as propriedades Effect.Timing necessárias.
  3. Salve o arquivo PPTX modificado.
// Instancia uma classe de apresentação que representa um arquivo de apresentação.
Presentation pres = new Presentation("AnimExample_out.pptx");
try {
    // Obtém a sequência principal do slide.
    ISequence sequence = pres.getSlides().get_Item(0).getTimeline().getMainSequence();

    // Obtém o primeiro efeito da sequência principal.
    IEffect effect = sequence.get_Item(0);

    // Altera o TriggerType do efeito para iniciar ao clicar
    effect.getTiming().setTriggerType(EffectTriggerType.OnClick);

    // Altera a Duração do efeito
    effect.getTiming().setDuration(3f);

    // Altera o TriggerDelayTime do efeito
    effect.getTiming().setTriggerDelayTime(0.5f);

    // Salva o arquivo PPTX no disco
    pres.save("AnimExample_changed.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Som do efeito de animação

Aspose.Slides fornece estas propriedades para permitir trabalhar com sons em efeitos de animação:

Adicionar som a um efeito de animação

Este código Java mostra como adicionar um som a um efeito de animação e pará-lo quando o próximo efeito começar:

Presentation pres = new Presentation("AnimExample_out.pptx");
try {
    // Adiciona áudio à coleção de áudio da apresentação
    IAudio effectSound = pres.getAudios().addAudio(Files.readAllBytes(Paths.get("sampleaudio.wav")));

    ISlide firstSlide = pres.getSlides().get_Item(0);

    // Obtém a sequência principal do slide.
    ISequence sequence = firstSlide.getTimeline().getMainSequence();

    // Obtém o primeiro efeito da sequência principal
    IEffect firstEffect = sequence.get_Item(0);

    // Verifica se o efeito está sem som
    if (!firstEffect.getStopPreviousSound() && firstEffect.getSound() == null)
    {
        // Adiciona som ao primeiro efeito
        firstEffect.setSound(effectSound);
    }

    // Obtém a primeira sequência interativa do slide.
    ISequence interactiveSequence = firstSlide.getTimeline().getInteractiveSequences().get_Item(0);

    // Define a flag "Stop previous sound" do efeito
    interactiveSequence.get_Item(0).setStopPreviousSound(true);

    // Grava o arquivo PPTX no disco
    pres.save("AnimExample_Sound_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Extrair som de um efeito de animação

  1. Crie uma instância da classe Presentation .
  2. Obtenha a referência de um slide pelo seu índice.
  3. Obtenha a sequência principal de efeitos.
  4. Extraia o setSound(IAudio value) incorporado a cada efeito de animação.

Este código Java mostra como extrair o som incorporado em um efeito de animação:

// Instancia uma classe de apresentação que representa um arquivo de apresentação.
Presentation presentation = new Presentation("EffectSound.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    // Obtém a sequência principal do slide.
    ISequence sequence = slide.getTimeline().getMainSequence();

    for (IEffect effect : sequence)
    {
        if (effect.getSound() == null)
            continue;

        // Extrai o som do efeito em um array de bytes
        byte[] audio = effect.getSound().getBinaryData();
    }
} finally {
    if (presentation != null) presentation.dispose();
}

Após a animação

Aspose.Slides for Java permite alterar a propriedade After animation de um efeito de animação.

Este é o painel de Animation Effect e o menu estendido no Microsoft PowerPoint:

example1_image

O menu suspenso After animation do PowerPoint corresponde a estas propriedades:

Este código Java mostra como mudar um efeito After animation:

// Instancia uma classe de apresentação que representa um arquivo de apresentação
Presentation pres = new Presentation("AnimImage_out.pptx");
try {
    ISlide firstSlide = pres.getSlides().get_Item(0);

    // Obtém o primeiro efeito da sequência principal
    IEffect firstEffect = firstSlide.getTimeline().getMainSequence().get_Item(0);

    // Altera o tipo de after animation para Cor
    firstEffect.setAfterAnimationType(AfterAnimationType.Color);

    // Define a cor de escurecimento do after animation
    firstEffect.getAfterAnimationColor().setColor(Color.BLUE);

    // Grava o arquivo PPTX no disco
    pres.save("AnimImage_AfterAnimation.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Animar texto

Aspose.Slides fornece estas propriedades para permitir trabalhar com o bloco Animate text de um efeito de animação:

É assim que você pode alterar as propriedades Animate text do efeito:

  1. Aplicar ou obter o efeito de animação.
  2. Defina a propriedade setBuildType(int value) para o valor BuildType.AsOneObject para desativar o modo de animação By Paragraphs.
  3. Defina novos valores para as propriedades setAnimateTextType(int value) e setDelayBetweenTextParts(float value).
  4. Salve o arquivo PPTX modificado.
// Instancia uma classe de apresentação que representa um arquivo de apresentação.
Presentation pres = new Presentation("AnimTextBox_out.pptx");
try {
    ISlide firstSlide = pres.getSlides().get_Item(0);

    // Obtém o primeiro efeito da sequência principal
    IEffect firstEffect = firstSlide.getTimeline().getMainSequence().get_Item(0);

    // Altera o tipo de animação de texto do efeito para "As One Object"
    firstEffect.getTextAnimation().setBuildType(BuildType.AsOneObject);

    // Altera o tipo de animação de texto do efeito para "By word"
    firstEffect.setAnimateTextType(AnimateTextType.ByWord);

    // Define o atraso entre palavras para 20% da duração do efeito
    firstEffect.setDelayBetweenTextParts(20f);

    // Grava o arquivo PPTX no disco
    pres.save("AnimTextBox_AnimateText.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

FAQ

Como posso garantir que as animações sejam preservadas ao publicar a apresentação na web?

Use Export to HTML5 e habilite as options responsáveis pelas animações de shape e transition. HTML simples não reproduz animações de slide, enquanto HTML5 reproduz.

Como a alteração da ordem Z (ordem de camada) das formas afeta a animação?

A ordem de animação e a ordem de desenho são independentes: um efeito controla o tempo e o tipo de aparição/desaparecimento, enquanto a z-order determina o que cobre o que. O resultado visível é definido pela combinação deles. (Esse é o comportamento geral do PowerPoint; o modelo de efeitos e formas do Aspose.Slides segue a mesma lógica.)

Existem limitações ao converter animações para vídeo para certos efeitos?

Em geral, as animações são suportadas, mas casos raros ou efeitos específicos podem ser renderizados de forma diferente. Recomenda-se testar com os efeitos que você usa e com a versão da biblioteca.