Animação no Silverlight

Documentos relacionados
Windows Presentation Foundation IFRN - RN

Modelos e controles personalizados. José Antônio da Cunha IFRN

Navegação. José Antônio da Cunha IFRN

Geometria. IFRN Natal - RN

Controls. José Antônio da Cunha IFRN

Shapes e Geometries. José Antônio da Cunha IFRN

Eventos. José Antônio da Cunha IFRN

Laboratório 3 WCF RIA Services

ASP.NET Web Services. José Antônio da Cunha IFRN

AULA 11. OBJETIVO: Conhecer e desenhar as Formas Geométricas VISÃO GERAL DA GEOMETRIA. Nesta aula vamos aprender a utilizar a classe Geometry.

José Antônio da Cunha 14/12/2012

Iniciação à Programação no 1.º Ciclo do Ensino Básico

Exercícios Práticos HTML5 + CSS3. Profa. Flávia Pereira de Carvalho

Exemplos Práticos HTML5 + CSS3. Profa. Flávia Pereira de Carvalho

Criar uma solução com um link Serviços RIA entre os projetos

Animação no flash. Prezado(a) aluno(a), 1. Técnicas de Animação. Animação quadro a quadro

CSS Cascading Style Sheets

12/06/2015. Prof. Fabiano Taguchi.

07/12/2014. Prof. Fabiano Taguchi. AUTORIA EM TÍTULOS HIPERMÍDIA

Exibe configurações do otimizador que podem ser editas pelo usuário. Cada otimizador possui configurações diferentes.

Computação Gráfica - 10

Sistemas Multimídia Aula 2. Autoria Multimídia

Introdução a Tecnologia da Informação

Criação de Animação com Sprite com HTML CANVAS

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO RIO GRANDE DO NORTE CAMPUS JOÃO CÂMARA APRESENTAÇÃO ELETRÔNICA POWER POINT (CONTINUAÇÃO)

Selecione o WPF Application dentro de Templates > Visual C# > Windows

The Helium Frog Animator Manual e Guia de exploração do The Helium Frog Animator para utilização em contexto de Educação Visual e Tecnoló gica

Animação 2D. Sistemas de Informação e Multimédia Módulo 5

Entendendo e usando permissões no Linux. Orientador de Curso: Rodrigo Caetano Filgueira

Halliday & Resnick Fundamentos de Física

COMO COMEÇAR Guia de Referência Rápida MAPAS

Exercício IV (2012/I)

Orientação a Objetos - Programação em C++

Banco de Dados. -Aprendendo conceitos -Usando o SQL Conf para: -Conectar no banco de dados -Criar, alterar, excluir e consultar estruturas de tabelas

Visual Basic.NET. Buttons, Checkboxes, Radio Buttons, Panels e Group Boxes. Professor: Danilo Giacobo

Loops. Loops Simples Switches Simples Loops Encadeados Switches Encadeados Utilizando Loops e Switches

Básico do Gimp. Passo 1. Execute o GIMP, após instalação do aplicativo no seu computador;

Plano de Aula - Flash CS6 - cód Horas/Aula

Aula 11 Windows Movie Maker

Utilização da Grelha Grid

TUTORIAL PARA O PROCESSO DE DESENHO DE CAVA UTILIZANDO O SOFTWARE MICROMINE

orm

OmniPC 4.2 Guia do usuário

Recursos Complementares (Tabelas e Formulários)

Interpretação de Gráficos da Cinemática

Flash CC Plano de Aula - 24 Aulas (Aulas de 1 Hora).

Excel INTERMEDIÁRIO. Prof. Cassiano Isler Turma 3

Plano de Aula - Flash CC - cód Horas/Aula

Sistema Ponto de Venda Turma do 3º ano

ÍNDICE. PowerPoint CAPÍTULO 1... CAPÍTULO 2... CAPÍTULO 3...

Curso: Especializado Maya

Utilização e visão geral dos aplicativos de Ensino Digital EvoBooks

Apostila de Windows Movie Maker

Objetivos: Familiarizar-se com o interface do Maya. Criar modelos e cenários virtuais com forte vertente na animação tridimensional.

Aparência. Lauri Watts Tradução: Lisiane Sztoltz

Interpolação no flash Nuno Machado

PROGRAMAÇÃO PARA INTERNET RICA FUNÇÕES E EVENTOS EM ACTIONSCRIPT 3. Prof. Dr. Daniel Caetano

ROBÓTICA PLANEJAMENTO DE TRAJETÓRIAS. Prof a. Dra. GIOVANA TRIPOLONI TANGERINO Tecnologia em Automação Industrial

Aplicações Informáticas B 12º Ano

Introdução: Neste jogo você deve orientar o grande peixe faminto e tentar comer todas as presas que estão nadando pelo mar.

Computação Gráfica - 04

WINDOWS FORMS APPLICATION - Aplicação (Programa) que não usa a CONSOLE

Tutorial Imprimir em 3D com Inkscape e Tinkercad

WINDOWS FORMS APPLICATION - Aplicação (Programa) que não usa a CONSOLE

PROGRAMAÇÃO PARA INTERNET RICA FUNÇÕES E EVENTOS EM ACTIONSCRIPT 3. Prof. Dr. Daniel Caetano

F E B A C. Exercício de Fixação 3. FACULDADE DE EDUCAÇÃO DE BACABAL FEBAC Credenciamento MEC/Portaria: 472/07 Resolução: 80/07

Qual a razão do termo cascata na terminologia CSS? A forma como as regras de estilo são aplicadas obedece a 3 princípios básicos: herança,

INF2608 Fundamentos da Computação Gráfica Prova Final de

Manual do Minuet. Sandro S. Andrade Tradução: André Marcelo Alvarenga

S C R A T C H P R O J E C T

Introdução ao HTML5 Canvas

Desenho de uma matriz de retângulos Serve de base para o exercício das cores

PROGRAMAÇÃO PARA INTERNET RICA EVENTOS EM ACTIONSCRIPT 3. Prof. Dr. Daniel Caetano

TUTORIAL PIXTON: Criando histórias em quadrinhos. Realização: Secretaria Geral de Educação a Distância da Universidade Federal de São Carlos

TECNOLOGIAS WEB. Unidade 3 Linguagem de Marcação e Estilo. Luiz Leão

Introdução à Engenharia ENG1000

CEDERJ - CENTRO DE EDUCAÇÃO SUPERIOR A DISTÂNCIA DO ESTADO DO RIO DE JANEIRO

Fundamentos Programação

Ambiente de programação

A terceira dimensão. A terceira dimensão. Modelagem tridimensional. A terceira dimensão Wilson de Pádua Paula Filho

Informática Básica Eletrotécnica/Mecânica

Tutorial básico para Kdenlive

Informática para Concursos

3. Linguagem de Programação C

Xubuntu O Xubuntu é um derivado da distribuição Ubuntu GNU/Linux que utiliza o ambiente Xfce que, utilizando menos recursos de sistema,

UNIVERSIDADE FEDERAL DE PELOTAS. Índice

Centralizar uma janela com uma janela Proprietário WPF

O aprendiz de investigador

SUMÁRIO INTRODUÇÃO... 3 CAPÍTULO 1 CAPÍTULO 2 CAPÍTULO 3 CAPÍTULO 4 CAPÍTULO 5 CAPÍTULO 6. Adobe Flash Professional CC 5

Disciplina: Desenvolvimento Web Professor: Paulo César Fernandes de Oliveira, BSc, PhD

Módulo 5. Microsoft Office Power Point 2007 Projeto Unifap Digital

TECLAS DE ATALHO POWER POINT 2010

Open Day Bibliotecas ElipseX

é usado para fechar a janela do são telas que podem conter textos, imagens, vídeos, sons e efeitos visuais.

Capítulo 9 - Imagens. Imagens

Introdução a Programação

ÍNDICE. CorelDRAW X4 -3- CAPÍTULO 1 INICIANDO O CorelDRAW... 7

Transcrição:

no Silverlight José Antônio da Cunha IFRN 1

no Silverlight A plataforma Silverlight permite a adição de efeitos visuais dinâmicos através da introdução de animações. Uma animação pode ser vista como uma ilusão, criada pela passagem rápida de um conjunto de imagens, onde cada uma é ligeiramente diferente da anterior. 2

Entendendo como a funciona no Silverlight Muitas vezes, uma animação é pensada como uma série de quadros. Para executar a animação, esses quadros são apresentados um após o outro. Essencialmente, uma animação é uma maneira de modificar o valor de uma propriedade de dependência durante um intervalo de tempo. Por exemplo, para criar um botão que aumenta e diminui, você pode modificar sua propriedade Largura (Width). Para um objeto brilhar, você pode alterar as propriedades do LinearGradientBrush que ele usa. O segredo para criar a animação correta é determinar quais propriedades você precisa modificar. 3

As regras de Você precisa estar ciente das seguintes regras fundamentais: do Silverlight são baseadas no tempo. Você define o estado inicial, o estado final, e a duração de sua animação. O Silverlight calcula a taxa de quadros. age sobre propriedades. A animação do Silverlight pode fazer apenas uma coisa: modificar o valor de uma propriedade em um intervalo de tempo. Cada tipo de dado exige uma classe de animação diferente. Por exemplo, a propriedade Button.Width usa o tipo de dados double. Para animá-lo, você usa a classe DoubleAnimation. 4

Criando uma animação simples Criar uma animação é um processo de múltiplas etapas. Você precisa criar três componentes distintos: um objeto para realizar a sua animação, um storyboard para gerenciar sua animação, e um manipulador de evento (um gatilho de eventos) para iniciar o seu storyboard. 5

A Classe de animação O Silverlight inclui dois tipos de classes de animação. Cada tipo de animação utiliza uma estratégia diferente para o valor de variáveis : Linear interpolation(interpolação linear): O valor da propriedade varia suavemente e continuamente ao longo da duração da animação. O Silverlight inclui três classes: DoubleAnimation, PointAnimation e ColorAnimation. Key-frame animation: Os valores podem saltar repentinamente de um valor para outro, ou eles podem combinar saltos e períodos de interpolação linear. O silverlight inclui quatro classes: ColorAnimationUsingKeyFrames, DoubleAnimationUsingKeyFrames, PointAnimationUsingKeyFrames, e ObjectAnimationUsingKeyFrames. 6

As animações são definidas usando marcação XAML. Por exemplo, veja o exemplo para criar uma DoubleAnimation. <DoubleAnimation From= 160 To= 300 Duration= 0:0:5 ></DoubleAnimation> Esta animação dura 5 segundos (conforme indicado pela propriedade Duração, que tem um valor de tempo no formato horas: minutos: Segundos.FraçãoSegundos). Enquanto a animação está sendo executada, ela muda o valor-alvo 160-300. Esta mudança ocorre de forma suave e contínua, porque o DoubleAnimation usa a interpolação linear. 7

A classe Storyboard O Storyboard gere a linha do tempo da sua animação. Você pode usar um storyboard para agrupar várias animações, e também tem a capacidade de controlar a reprodução da animação pausá-la, interrompê-la e alterar sua posição. Mas a característica mais básica fornecida pela classe Storyboard é a sua capacidade de apontar para uma determinada propriedade de um elemento específico usando as propriedades TargetProperty. Em outras palavras, o storyboard faz a ponte entre a animação e a propriedade que você deseja animar. 8

Veja um exemplo que define como um storyboard aplica um DoubleAnimation para a propriedade Width de um retângulo chamado rct. <Rectangle Width="100" Height="100" Fill="Red" x:name="rct"/> <StoryBoard x:name="storyboard" Storyboard.TargetName= rct" Storyboard.TargetProperty="Width"> <DoubleAnimation From="160" To="300" Duration="0:0:5"></DoubleAnimation> </StoryBoard> 9

Iniciando uma animação com evento Trigger <UserControl.Triggers> <EventTrigger> <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetName= rct" Storyboard.TargetProperty="Width" From="160" To="300" Duration="0:0:5"> </DoubleAnimation> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> </UserControl.Triggers> <Grid x:name="layoutroot" Background="White"> <Rectangle x:name= rct" Width="160" Height="30 Fill= Red ></Button> </Grid> 10

Iniciando uma animação com código <UserControl.Resources> <Storyboard x:name="storyboard"> <DoubleAnimation Storyboard.TargetName= rct" Storyboard.TargetProperty="Width" From="100" To="300" Duration="0:0:5"> </DoubleAnimation> </Storyboard> </UserControl.Resources> <Grid x:name="layoutroot" Background="White"> <Rectangle x:name= rct" Width= 100" Height= 100 /> </Grid> public MainPage() { InitializeComponent(); storyboard.begin(); } 11

Configurando as propriedades da animação From valor inicial da animação. No exemplo anterior, a animação inicia com 160 pixels. TO valor final da animação. No exemplo anterior, a animação inicia com 300 pixels. By Ao invés de usar TO, você pode usar a propriedade By. A propriedade By é usada para criar uma animação que altera um valor por um valor definido, ao invés de um alvo específico. Por exemplo, você pode criar uma animação que amplia um botão por 10 pixels mais do que seu tamanho atual, como mostrado aqui: <DoubleAnimation Storeyboard.TargetName= cmdgrow By= 10 Storyboard.TargetProperty= Width Duration= 0:0:5 ></DoubleAnimation> Duration A propriedade Duration, define o intervalo de tempo entre o momento do início da animação e o final. 12

RepeatBehavior A propriedade RepeatBehavior permite que você controle como uma animação se repete. Se você deseja repetir um determinado número de vezes, indicar o número de vezes para repetir, seguido por um x. Por exemplo, essa animação se repete duas vezes: <DoubleAnimation Storeyboard.TargetName= rct By= 10 RepeatBehavior= 2x Storyboard.TargetProperty= Width Duration= 0:0:5 ></DoubleAnimation> <DoubleAnimation Storeyboard.TargetName= rct By= 10 RepeatBehavior= 0:0:13 To= 300 Storyboard.TargetProperty= Width Duration= 0:0:5 ></DoubleAnimation> <DoubleAnimation Storeyboard.TargetName= rct By= 10 RepeatBehavior= Forever To= 300 Storyboard.TargetProperty= Width Duration= 0:0:5 ></DoubleAnimation> 13

Animações simultâneas A classe Storyboard tem a capacidade de manter mais do que uma animação. Melhor de tudo, essas animações são gerenciados como um grupo. O que significa que começaram ao mesmo tempo. <UserControl.Resources> <Storyboard x:name="storyboard" Storyboard.TargetName= rct"> <DoubleAnimation Storyboard.TargetProperty="Width" To="300" Duration="0:0:5"></DoubleAnimation> <DoubleAnimation Storyboard.TargetProperty="Height" To="300" Duration="0:0:5"></DoubleAnimation> </Storyboard> </UserControl.Resources> <Grid x:name="layoutroot" Background="White" Loaded="LayoutRoot_Loaded"> <Button x:name= rct" Width="100" Height="30"></Button> </Grid> 14

Como controlar a reprodução Você já viu como iniciar uma animação usando o método Storyboard.Begin(). A classe Storyboard também fornece alguns métodos a mais que permitem parar ou pausar uma animação. private void cmdstart_click(object sender, RoutedEventArgs e) { fadestoryboard.begin(); } private void cmdpause_click(object sender, RoutedEventArgs e) { fadestoryboard.pause(); } private void cmdresume_click(object sender, RoutedEventArgs e) { fadestoryboard.resume(); } private void cmdstop_click(object sender, RoutedEventArgs e) { fadestoryboard.stop(); } 15

Easing Function Antes de considerar as funções easing, é importante compreender quando uma função de easing é aplicada. Cada classe (função) Easing deriva de EasingFunctionBase e herda uma propriedade única chamada EasingMode. Esta propriedade tem três valores possíveis: EasingIn (o que significa que o efeito é aplicado para o início da animação), EaseOut (que significa que é aplicada ao final), e EaseInOut (que significa que é aplicada tanto no início e no final). 16

Easing Function Em animações que usam interpolação linear, o crescimento e o encolhimento acontecem de forma constante e mecânica. Para um efeito mais natural, você pode adicionar a função de atenuação. O exemplo a seguir adiciona uma função de atenuação chamado ElasticEase. O resultado final é que o botão se move como uma molas, oscilando para trás e para frente, sobre seu tamanho. O movimento elástico, diminue gradualmente, até parar depois de dez oscilações. Vejam que quem controla as oscilações é a propriedade oscillation. 17

Easing Function A easing function requer muito menos trabalho do que outras abordagens, como animação baseada em quadros. Basta você definir a propriedade EasingFunction de um objeto de animação. <UserControl.Triggers> <EventTrigger> <EventTrigger.Actions> <BeginStoryboard> <Storyboard x:name="growstoryboard"> <DoubleAnimation Storyboard.TargetName= rct" Storyboard.TargetProperty= Height" To="400" Duration="0:0:5"> <DoubleAnimation.EasingFunction> <ElasticEase EasingMode="EaseOut" Oscillations="10"></ElasticEase> </DoubleAnimation.EasingFunction> </DoubleAnimation> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> </UserControl.Triggers> 18

Easing Function (Outras propriedades) EBackEase; lasticease; BounceEase; CircleEase; CubicEase; QuadraticEase; QuarticEase; QuinticEase; SineEase; PowerEase; ExponentialEase. Veja os exemplos no site: http://tinyurl.com/animationeasing 19

Transformação Quando você usa as transformações, não apenas altera os limites de um elemento. Em vez disso, você pode alterar, inverter, distorcer, esticar, ampliar, encolher, ou rotacionar o elemento. <Storyboard x:name="rotatestoryboard"> <DoubleAnimation Storyboard.TargetName="rotateTrans" Storyboard.TargetProperty="Angle" To="360" Duration="0:0:0.8" RepeatBehavior="Forever"> </DoubleAnimation> </Storyboard> <Button Content="Um botão" Margin="5" RenderTransformOrigin="0.5,0.5" MouseEnter="Button_MouseEnter" > <Button.RenderTransform> <RotateTransform x:name="rotatetrans"></rotatetransform> </Button.RenderTransform> </Button> private void Button_MouseEnter(object sender, MouseEventArgs e) { rotatestoryboard.begin(); } 20

Transformação <Storyboard x:name="rotatestoryboard"> <DoubleAnimation Storyboard.TargetName="projection" Storyboard.TargetProperty="RotationY" From="0 To="360" Duration="0:0:3" RepeatBehavior="Forever"> </DoubleAnimation> <DoubleAnimation Storyboard.TargetName="projection" RepeatBehavior="Forever" Storyboard.TargetProperty="RotationZ" From="0" To="360" Duration="0:0:30"> </DoubleAnimation> <DoubleAnimation Storyboard.TargetName="projection" RepeatBehavior="Forever" Storyboard.TargetProperty="RotationX" From="0" To="360" Duration="0:0:40"></DoubleAnimation> </Storyboard> <Border CornerRadius="2" Padding="10" Height="140" Width="170" BorderBrush="SlateGray" BorderThickness="4"> <Border.Projection> <PlaneProjection x:name="projection"></planeprojection> </Border.Projection> </Border> 21

Projeções e Perspectivas Assim como você pode animar e transformar, você também pode animar projeções em perspectiva, ou seja, a classe PlaneProjection permite simular uma superfície plana, título 3-D, etc. Por exemplo, imagine que você tenha um grupo de elementos envolvidos em um controle Border, e que usa uma border PlaneProjection, como mostro aqui: <Grid x:name="layoutroot" Background="White" Loaded="LayoutRoot_Loaded"> <Border CornerRadius="2" Padding="10" Height="140" Width="170" BorderBrush="SlateGray" BorderThickness="4"> <Border.Projection> <PlaneProjection x:name="projection"></planeprojection> </Border.Projection> <Button x:name="btnok" Width="50" Height="50" Content="OK"></Button> </Border> </Grid> Veja a animação com a projeção a seguir: 22

Projeções e Perspectivas <UserControl.Resources> <Storyboard x:name="spinstoryboard"> <DoubleAnimation Storyboard.TargetName="projection" RepeatBehavior="Forever" Storyboard.TargetProperty="RotationY" From="0" To="360" Duration="0:0:3"> </DoubleAnimation> <DoubleAnimation Storyboard.TargetName="projection" RepeatBehavior="Forever" Storyboard.TargetProperty="RotationZ" From="0" To="360" Duration="0:0:30"> </DoubleAnimation> <DoubleAnimation Storyboard.TargetName="projection" RepeatBehavior="Forever" Storyboard.TargetProperty="RotationX" From="0" To="360" Duration="0:0:40"> </DoubleAnimation> </Storyboard> </UserControl.Resources> 23

Animações Brushes Animações Brushes é uma outra técnica comum em animações em Silverlight, e é tão fácil como animar transformações. Novamente, a técnica consiste em modificar uma sub-propriedade que você deseja mudar, usando o tipo de animação adequadas. No exemplo, o ponto central do gradiente radial deriva ao longo da elipse, dando-lhe um efeito tridimensional. Ao mesmo tempo, a cor exterior do gradiente muda de azul para preto <Grid x:name="layoutroot" Background="White" Loaded="LayoutRoot_Loaded"> <Ellipse x:name="ellipse" Margin="5" Grid.Row="1" Stretch="Uniform" > <Ellipse.Fill> <RadialGradientBrush x:name="ellipsebrush" RadiusX="1" RadiusY="1" GradientOrigin="0.7,0.3"> <GradientStop x:name="ellipsebrushstop" Color="White" Offset="0"></GradientStop> <GradientStop Color="Blue" Offset="1"></GradientStop> </RadialGradientBrush> </Ellipse.Fill> </Ellipse> </Grid> 24

Animações Brushes para o exemplo anterior <UserControl.Resources> <Storyboard x:name="ellipsestoryboard"> <PointAnimation Storyboard.TargetName="ellipseBrush" Storyboard.TargetProperty="GradientOrigin" From="0.7,0.3" To="0.3,0.7" Duration="0:0:10" AutoReverse="True" RepeatBehavior="Forever"> </PointAnimation> <ColorAnimation Storyboard.TargetName="ellipseBrushStop" Storyboard.TargetProperty="Color" To="Black" Duration="0:0:10" AutoReverse="True" RepeatBehavior="Forever"> </ColorAnimation> </Storyboard> </UserControl.Resources> 25

Pixel Shaders Pixel shaders é um recurso interessante, mas apenas ocasionalmente útil. Mas combinado com animação, eles se tornam muito mais versátil. Você pode usá-los para criar efeitos impressionantes interatividade com o usuário (por exemplo, aumentando o brilho em um botão quando o usuário move o mouse sobre ele). O melhor de tudo, você pode animar as propriedades de um pixel shader tão facilmente como você animar qualquer outra coisa. 26

Animating Brushes <Storyboard x:name="ellipsestoryboard"> <PointAnimation Storyboard.TargetName="ellipseBrush" Storyboard.TargetProperty="GradientOrigin" From="0.7,0.3" To="0.3,0.7" Duration="0:0:10" AutoReverse="True" RepeatBehavior="Forever"> </PointAnimation> <ColorAnimation Storyboard.TargetName="ellipseBrushStop" Storyboard.TargetProperty="Color" To="Black" Duration="0:0:10" AutoReverse="True" RepeatBehavior="Forever"> </ColorAnimation> </Storyboard> <Ellipse x:name="ellipse" Margin="5" Grid.Row="1" Stretch="Uniform" > <Ellipse.Fill> <RadialGradientBrush x:name="ellipsebrush" RadiusX="1" RadiusY="1" GradientOrigin="0.7,0.3"> <GradientStop x:name="ellipsebrushstop" Color="Wheat" Offset="0"></GradientStop> <GradientStop Color="Blue" Offset="1"></GradientStop> </RadialGradientBrush> </Ellipse.Fill> </Ellipse> 27

por key-frame A animação key-frame é uma animação que é feita de muitos pequenos segmentos. Cada segmento representa um valor inicial, final ou intermediário na animação. Quando você executa a animação, move-se suavemente de um valor para outro. Veja o exemplo usando PointAnimatio. <PointAnimation Storyboard.TargetName= ellipsebrush Storyboard.TargetProperty= GradientOrigin From= 0.7,0.3 To= 0.3,0.7 Duration= 0:0:10 AutoReverse= True RepeatBehavior= Forever> </PointAnimation> 28

O exemplo anterior usando key-frame <PointAnimationUsingKeyFrame Storyboard.TargetName= ellipsebrush Storyboard.TargetProperty= GradientOrigin AutoReverse= True RepeatBehavior= Forever > <LinearPointKeyFrame Value= 0.7,0.3 KeyTime= 0:0:0 ></LinearPointKeyFrame> <LinearPointKeyFrame Value= 0.3,0.7 KeyTime= 0:0:10 ></LinearPointKeyFrame> </PointAnimationUsingKeyFrame> Esta animação inclui dois key-frames. O primeiro define o valor dos pontos quando a animação começa. O segundo key-frame define o valor final, que é alcançado após 10 segundos. O objeto PointAnimationUsingKeyFrames executa uma interpolação linear para mover-se suavemente a partir do valor de 1º key-frame para o segundo, assim como faz PointAnimation para ir de From pata To. 29

Exemplo usando key-frame <UserControl.Resources> <Storyboard x:name="ellipsestoryboard"> <PointAnimationUsingKeyFrames Storyboard.TargetName="ellipseBrush" Storyboard.TargetProperty="GradientOrigin" AutoReverse="True" RepeatBehavior="Forever"> <LinearPointKeyFrame Value="0.7,0.3" KeyTime="0:0:0"></LinearPointKeyFrame> <LinearPointKeyFrame Value="0.3,0.7" KeyTime="0:0:10"></LinearPointKeyFrame> </PointAnimationUsingKeyFrames> </Storyboard> </UserControl.Resources> <Grid x:name="layoutroot" Background="White" Loaded="LayoutRoot_Loaded"> <Ellipse x:name="ellipse" Margin="5" Grid.Row="1" Stretch="Uniform"> <Ellipse.Fill> <RadialGradientBrush x:name="ellipsebrush" RadiusX="1" RadiusY="1" GradientOrigin="0.7,0.3"> <GradientStop x:name="ellipsebrushstop" Color="White" Offset="0"></GradientStop> <GradientStop Color="Blue" Offset="1"></GradientStop> </RadialGradientBrush> </Ellipse.Fill> </Ellipse> </Grid> 30

Discrete key-frame A animação por key-frame que você viu nos exemplos anteriores usava key frames linear. Como resultado, a transição entre os valores dos key-frame é suave. Outra opção é usar Discrete key frames. Neste caso, a animação é feita sem interpolação. Quando o key time é atingido, a propriedade muda abruptamente para o novo valor. 31

Exemplo usando Discrete key-frame <UserControl.Resources> <Storyboard x:name="ellipsestoryboard"> <PointAnimationUsingKeyFrames Storyboard.TargetName="ellipseBrush" Storyboard.TargetProperty="GradientOrigin" AutoReverse="True" RepeatBehavior="Forever"> <DiscretePointKeyFrame Value="0.7,0.3" KeyTime="0:0:0"></DiscretePointKeyFrame> <DiscretePointKeyFrame Value="0.3,0.7" KeyTime="0:0:5"></DiscretePointKeyFrame> <DiscretePointKeyFrame Value="0.5,0.9" KeyTime="0:0:8"></DiscretePointKeyFrame> <DiscretePointKeyFrame Value="0.9,0.6" KeyTime="0:0:10"></DiscretePointKeyFrame> <DiscretePointKeyFrame Value="0.8,0.2" KeyTime="0:0:12"></DiscretePointKeyFrame> <DiscretePointKeyFrame Value="0.7,0.3" KeyTime="0:0:14"></DiscretePointKeyFrame> </PointAnimationUsingKeyFrames> </Storyboard> </UserControl.Resources> 32

Exemplo usando Easing key-frame <UserControl.Resources> <Storyboard x:name="ellipsestoryboard"> <PointAnimationUsingKeyFrames Storyboard.TargetName="ellipseBrush" Storyboard.TargetProperty="GradientOrigin" RepeatBehavior="Forever"> <LinearPointKeyFrame Value="0.7,0.3" KeyTime="0:0:0"></LinearPointKeyFrame> <EasingPointKeyFrame Value="0.3,0.7" KeyTime="0:0:5"> <EasingPointKeyFrame.EasingFunction> <CircleEase></CircleEase> </EasingPointKeyFrame.EasingFunction> </EasingPointKeyFrame> <LinearPointKeyFrame Value="0.5,0.9" KeyTime="0:0:8"></LinearPointKeyFrame> <LinearPointKeyFrame Value="0.9,0.6" KeyTime="0:0:10"></LinearPointKeyFrame> <LinearPointKeyFrame Value="0.8,0.2" KeyTime="0:0:12"></LinearPointKeyFrame> <LinearPointKeyFrame Value="0.7,0.3" KeyTime="0:0:14"></LinearPointKeyFrame> </PointAnimationUsingKeyFrames> </Storyboard> </UserControl.Resources> 33

Spline key-frame Como os Linear Key Frames, Spline key frames usam interpolação para mover suavemente de um valor chave para o outro. A diferença é que cada spline key frame esporte uma propriedade KeySpline. Usando a propriedade KeySpline, você define uma curva de Bézier cúbica que influencia como modo de interpolação é executada. 34

Exemplo usando Spline key-frame <Grid x:name="layoutroot" Background="White" Loaded="LayoutRoot_Loaded"> <Canvas> <Canvas.Resources> <Storyboard x:name="ellipsespline"> <DoubleAnimationUsingKeyFrames Storyboard.TargetName="Elipse1" Storyboard.TargetProperty="(Canvas.Left)"> <SplineDoubleKeyFrame KeyTime="0:0:5" Value="250" KeySpline="0.25,0 0.5,0.7"></SplineDoubleKeyFrame> <SplineDoubleKeyFrame KeyTime="0:0:10" Value="500" KeySpline="0.25,0.8 0.2,0.3"></SplineDoubleKeyFrame> </DoubleAnimationUsingKeyFrames> </Storyboard> </Canvas.Resources> <Ellipse x:name="elipse1" Width="50" Height="50" Fill="Black" Canvas.Top="1" Canvas.Left="1"></Ellipse> </Canvas> </Grid> 35