动画基础,3种动画方式

WPF编程学习——动画

WPF中的动画——(一)基本概念

WPF中的动画——(二)From/To/By 动画

WPF中的动画——(三)时间线(TimeLine)

WPF中的动画——(四)缓动函数

WPF中的动画——(五)关键帧动画

本文将介绍WPF 中三种基本动画,线性插值、关键帧和路径动画。

  在 System.Windows.Media.Animation 这个命名空间中,包含了三种动画类:线性插值动画类(17个)、关键帧动画(22个)、路径动画(3个)。

  在C#代码中使用Animation类,需要引入命名空间:System.Windows.Media.Animation

  using System.Windows.Media.Animation;

1、线性插值动画

  该动画表现为,元素的某个属性,在开始值和结束值之间逐步增加,是一种线性插值的过程。比如,实现一个按钮的淡入效果,让它的透明度Opacity在0~1之间线性增长,就可以实现预期效果。

  以下是 System.Windows.Media.Animation 命名空间中,17个线性插值动画类。  

ByteAnimation

ColorAnimation

DecimalAnimation

DoubleAnimation

Int16Animation

Int32Animation

Int64Animation

Point3DAnimation

PointAnimation

QuaternionAnimation

RectAnimation

Rotation3DAnimation

SingleAnimation

SizeAnimation

ThicknessAnimation

Vector3DAnimation

VectorAnimation

示例1:以 DoubleAnimation 为例,实现文字的淡入效果。

  在XAML中可以直接定义动画,以下示例是以后台代码形式实现的动画。

  XAML

<TextBlock Height="50" Width="220" Foreground="#326939" FontSize="36" Name="textBlock1" Text="文字淡入效果"/>

  CS  

DoubleAnimation da = new DoubleAnimation();
da.From = 0;    //起始值
da.To = 1;      //结束值
da.Duration = TimeSpan.FromSeconds(3);         //动画持续时间
this.textBlock1.BeginAnimation(TextBlock.OpacityProperty, da);//开始动画

  

示例2:利用 ThicknessAnimation ,实现元素平移效果。

  XMAL

<TextBlock Height="50" Foreground="#326939" Margin="0,100,0,0" FontSize="36" Name="textBlock1" Text="文字平移"/>

  CS

//文字平移,Margin属性是Thickness类型,选择ThicknessAnimation
ThicknessAnimation ta = new ThicknessAnimation();
ta.From = new Thickness(0, 100, 0, 0);             //起始值
ta.To = new Thickness(240, 100, 0, 0);        //结束值
ta.Duration = TimeSpan.FromSeconds(3);         //动画持续时间
this.textBlock1.BeginAnimation(TextBlock.MarginProperty, ta);//开始动画

2、关键帧动画

  关键帧动画是以时间为节点,在指定时间节点上,属性达到某个值。

  以下是 System.Windows.Media.Animation 命名空间中,22个关键帧动画类。  

BooleanAnimationUsingKeyFrames

ByteAnimationUsingKeyFrames

CharAnimationUsingKeyFrames

ColorAnimationUsingKeyFrames

DecimalAnimationUsingKeyFrames

DoubleAnimationUsingKeyFrames

Int16AnimationUsingKeyFrames

Int32AnimationUsingKeyFrames

Int64AnimationUsingKeyFrames

MatrixAnimationUsingKeyFrames

ObjectAnimationUsingKeyFrames

Point3DAnimationUsingKeyFrames

PointAnimationUsingKeyFrames

QuaternionAnimationUsingKeyFrames

RectAnimationUsingKeyFrames

Rotation3DAnimationUsingKeyFrames

SingleAnimationUsingKeyFrames

SizeAnimationUsingKeyFrames

StringAnimationUsingKeyFrames

ThicknessAnimationUsingKeyFrames

Vector3DAnimationUsingKeyFrames

VectorAnimationUsingKeyFrames

示例3:Border宽度的关键帧动画

XAML

<Border Height="32" Width="0" Background="#326939"  Name="border1"/>

CS

//Border长度关键帧动画
DoubleAnimationUsingKeyFrames dak = new DoubleAnimationUsingKeyFrames();
//关键帧定义
dak.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0))));
dak.KeyFrames.Add(new LinearDoubleKeyFrame(240, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(3))));
dak.KeyFrames.Add(new LinearDoubleKeyFrame(240, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(6))));
dak.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(9))));

dak.BeginTime = TimeSpan.FromSeconds(2);//从第2秒开始动画
dak.RepeatBehavior = new RepeatBehavior(3);//动画重复3次
//开始动画
this.border1.BeginAnimation(Border.WidthProperty, dak);

  (程序运行时开始计时,第0秒)

  0~5:动画尚未开始;

  5~8:border1宽度从0增加到240;

  8~11:border1宽度保持240不变;

  11~14:border1宽度从240减少到0;

  14-17:又从0增加到240……(即5~14的过程循环3次)

3、路径动画

  基于路径的动画,比起前两种更加专业一些。它的表现方式是,修改数值使其符合PathGeometry对象描述的形状,并且让元素沿着路径移动。以下是 System.Windows.Media.Animation 命名空间中,3个路径动画类。

DoubleAnimationUsingPath

MatrixAnimationUsingPath

PointAnimationUsingPath

示例4:基于路径动画的演示

XMAL(该动画是在XAML中定义,使用事件触发器,窗体加载时开始动画)

<Window x:Class="WpfApplication9.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="360" Width="480">
    <Window.Resources>
        <!--路径资源-->
        <PathGeometry x:Key="path">
            <PathFigure IsClosed="True">
                <ArcSegment Point="200,200" Size="30,10" SweepDirection="Clockwise"></ArcSegment>
                <ArcSegment Point="300,200" Size="5,5"></ArcSegment>
            </PathFigure>
        </PathGeometry>
    </Window.Resources>
    <!---事件触发器,窗体加载时动画开始,周期6秒,无限循环-->
    <Window.Triggers>
        <EventTrigger RoutedEvent="Window.Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimationUsingPath Storyboard.TargetName="image" Storyboard.TargetProperty="(Canvas.Left)"
                     PathGeometry="{StaticResource path}" Duration="0:0:6" RepeatBehavior="Forever" Source="X"></DoubleAnimationUsingPath>
                    <DoubleAnimationUsingPath Storyboard.TargetName="image" Storyboard.TargetProperty="(Canvas.Top)"
                     PathGeometry="{StaticResource path}" Duration="0:0:6" RepeatBehavior="Forever" Source="Y"></DoubleAnimationUsingPath>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Window.Triggers>
    <Canvas>
        <!--显示路径-->
        <Path Margin="30" Stroke="#ddd" Data="{StaticResource path}"></Path>
        <!--动画元素-->
        <Image Name="image" Source="me.png" Width="48" Height="48" />
    </Canvas>
</Window>

  我的头像将沿着曲线路径进行移动,由于RepeatBehavior属性设置为Forever,则动画将无限循环。

 Storyboard animationTab = new Storyboard();
               DoubleAnimationUsingKeyFrames da1 = new DoubleAnimationUsingKeyFrames();
               Storyboard.SetTarget(da1, gridA);
               Storyboard.SetTargetProperty(da1, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"));
               EasingDoubleKeyFrame edk1_1 = new EasingDoubleKeyFrame();
               edk1_1.KeyTime = TimeSpan.FromSeconds(0.5);
               edk1_1.Value = zoomNum;
               da1.KeyFrames.Add(edk1_1);
               EasingDoubleKeyFrame edk1_2 = new EasingDoubleKeyFrame();
               edk1_2.KeyTime = TimeSpan.FromSeconds(1);
               edk1_2.Value = narrowNum;
               // edk1_2.EasingFunction = new QuinticEase() { EasingMode = EasingMode.EaseOut };
               da1.KeyFrames.Add(edk1_2);

               animationTab.Children.Add(da1);

               DoubleAnimationUsingKeyFrames da2 = new DoubleAnimationUsingKeyFrames();
               Storyboard.SetTarget(da2, gridA);
               Storyboard.SetTargetProperty(da2, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"));
               EasingDoubleKeyFrame edk2_1 = new EasingDoubleKeyFrame();
               edk2_1.KeyTime = TimeSpan.FromSeconds(0.5);
               edk2_1.Value = zoomNum;
               da2.KeyFrames.Add(edk2_1);
               EasingDoubleKeyFrame edk2_2 = new EasingDoubleKeyFrame();
               edk2_2.KeyTime = TimeSpan.FromSeconds(1);
               edk2_2.Value = narrowNum;
               //edk2_2.EasingFunction = new QuinticEase() { EasingMode = EasingMode.EaseOut };
               da2.KeyFrames.Add(edk2_2);
               animationTab.Children.Add(da2);

               DoubleAnimationUsingKeyFrames da3 = new DoubleAnimationUsingKeyFrames();
               Storyboard.SetTarget(da3, gridA);
               Storyboard.SetTargetProperty(da3, new PropertyPath("(Canvas.Left)"));
               EasingDoubleKeyFrame edk3_1 = new EasingDoubleKeyFrame();
               edk3_1.KeyTime = TimeSpan.FromSeconds(0.5);
               edk3_1.Value = (double)gridA.GetValue(Canvas.LeftProperty);
               da3.KeyFrames.Add(edk3_1);
               EasingDoubleKeyFrame edk3_2 = new EasingDoubleKeyFrame();
               edk3_2.KeyTime = TimeSpan.FromSeconds(1.5);
               edk3_2.Value = ttfX;
               da3.KeyFrames.Add(edk3_2);
               animationTab.Children.Add(da3);

               DoubleAnimationUsingKeyFrames da4 = new DoubleAnimationUsingKeyFrames();
               Storyboard.SetTarget(da4, gridA);
               Storyboard.SetTargetProperty(da4, new PropertyPath("(Canvas.Top)"));
               EasingDoubleKeyFrame edk4_1 = new EasingDoubleKeyFrame();
               edk4_1.KeyTime = TimeSpan.FromSeconds(0.5);
               edk4_1.Value = (double)gridA.GetValue(Canvas.TopProperty);
               da4.KeyFrames.Add(edk4_1);
               EasingDoubleKeyFrame edk4_2 = new EasingDoubleKeyFrame();
               edk4_2.KeyTime = TimeSpan.FromSeconds(1.5);
               edk4_2.Value = ttfY;
               da4.KeyFrames.Add(edk4_2);
               animationTab.Children.Add(da4);

               DoubleAnimationUsingKeyFrames da5 = new DoubleAnimationUsingKeyFrames();
               Storyboard.SetTarget(da5, gridA);
               Storyboard.SetTargetProperty(da5, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)"));
               EasingDoubleKeyFrame edk5_1 = new EasingDoubleKeyFrame();
               edk5_1.KeyTime = TimeSpan.FromSeconds(0.5);
               edk5_1.Value = 0;
               da5.KeyFrames.Add(edk5_1);
               EasingDoubleKeyFrame edk5_2 = new EasingDoubleKeyFrame();
               edk5_2.KeyTime = TimeSpan.FromSeconds(1.5);
               edk5_2.Value = 180;
               da5.KeyFrames.Add(edk5_2);
               animationTab.Children.Add(da5);

               PointAnimationUsingKeyFrames da6 = new PointAnimationUsingKeyFrames();
               Storyboard.SetTarget(da6, gridA);
               Storyboard.SetTargetProperty(da6, new PropertyPath("(UIElement.RenderTransformOrigin)"));
               EasingPointKeyFrame edk6_1 = new EasingPointKeyFrame();
               edk6_1.KeyTime = TimeSpan.FromSeconds(0.5);
               edk6_1.Value = new Point(0.5, 0.5);
               da6.KeyFrames.Add(edk6_1);
               EasingPointKeyFrame edk6_2 = new EasingPointKeyFrame();
               edk6_2.KeyTime = TimeSpan.FromSeconds(1);
               edk6_2.Value = new Point(0, 0);
               da6.KeyFrames.Add(edk6_2);
               animationTab.Children.Add(da6);

               animationTab.Completed += (o, e) =>
               {
                   animationTab.Stop();
                   gridA.Visibility = Visibility.Collapsed;
                  mWindow.canvasSB.Children.Remove(gridA);
                   if (aEnum != AnimationFlyEnum.None)
                       buttonAnimationAddOne(aEnum, horSet);
                   if (ac != null)
                       ac.Invoke();
               };
               animationTab.Begin();
时间: 2024-10-16 03:01:15

动画基础,3种动画方式的相关文章

动画的几种实现方式

15.1 动画介绍 在iOS中动画实现技术主要是:Core Animation. Core Animation负责所有的滚动.旋转.缩小和放大以及所有的iOS动画效果.其中UIKit类通常都有animated:参数部分,它可以允许是否使用动画. Core Animation还与Quartz紧密结合在一起,每个UIView都关联到一个CALayer对象,CALayer是Core Animation中的图层. 15.2 Core Animation基础 Core Animation创建动画时候会修改

Android动画的两种使用方式。

android 动画的分类就不说了,主要说一下动画的两种使用方法:1.通过代码生成并使用动画 (不利于重复使用) 2.通过xml文件生成并使用动画(更方便,重用性高). 1.通过代码生成动画 ? 1 2 3 4 5 //初始化 Animation scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f); //设置动画时间 scaleAnimation.setDuration(500); this.startAnimation(scale

android 动画基础绘——view 动画(二)[补]

前言 这个是对view 动画的补充,是一些view 动画的特殊使用场景. 回顾第一篇关于view 动画的,我介绍到view的动画都是针对元素本身的. 当我们开发view动画的时候,我们看到几个元素在做相同规律的变化,如果我们去一个个设置的话,当然是可以的,但是呢一个代码不美观. 同样我们看到,我们进入下一个页面的时候,那么有一个切换动画.这些基本都可以用view 动画实现. 正文 activity 切换效果 Intent intent=new Intent(this,demo.class); s

iOS 动画基础-显式动画

摘要 显式动画 属性动画 CABasicAnimation *animation = [CABasicAnimation animation];         [self updateHandsAnimated:NO];         animation.keyPath = @"transform";         animation.toValue = [NSValue valueWithCATransform3D:transform];         animation.d

shell脚本基础-四种启动方式

1.当前路径启动 ./test.sh 2.绝对路径启动 pwd /data/beijing 'pwd'/test.sh 3.指定解释器执行 sh test.sh bash test.sh 4.shell环境执行 . test.sh source test.sh 原文地址:https://www.cnblogs.com/freeht/p/12132890.html

android animation动画效果的两种实现方式

animation动画效果两种实现方式 注:此例为AlphaAnimation效果,至于其他效果,换一下对象即可. 1..java文件 代码控制 添加并且开始animation动画 //添加动画效果 AlphaAnimation animation = new AlphaAnimation(0.3f, 1.0f); //设置次效果的持续时间 animation.setDuration(2000); //设置动画的监听事件 animation.setAnimationListener(new An

android缩放动画的两种实现方法

在android开发.我们会常常使用到缩放动画,普通情况下缩放动画有两种实现方式.一种是直接通过java代码去实现,第二种是通过配置文件实现动画,以下是两种动画的基本是用法: Java代码实现: //创建缩放动画对象 Animation animation = new ScaleAnimation(0, 1.0f, 0f, 1.0f); animation.setDuration(1500);//动画时间 animation.setRepeatCount(3);//动画的反复次数 animati

Android三种动画原理

Android起初有两种动画:Frame Animation(逐帧动画) Tween Animation(补间动画) 两种动画的工作原理: Frame Animation:大体意思就是将UI设计的多张图片组成的动画,然后在将他们组合起来连贯进行播放,类似于早期电影的工作原理. Tween Animation:是对某个View进行一系列的动画的操作,包括淡入淡出(Alpha),缩放(Scale),平移(Translate),旋转(Rotate)四种模式 然而在从Android3.0版本开始后,An

【Away3D代码解读】(五):动画模块及骨骼动画

动画模块核心存放在away3d.animators包里: Away3D支持下面几种动画格式: VertexAnimator:顶点动画 SkeletonAnimator:骨骼动画 UVAnimator:UV动画 SpriteSheetAnimator:二维切换动画 ParticleAnimator:粒子动画 PathAnimator:路径动画 这几种动画都有各自的特点及应用场景,一般而在3D游戏中应用得最广泛的是骨骼动画,因为骨骼动画是人物动画的核心,我们下半段会专门详解这个动画: 动画简介 核心