WPF Animation Provider
来源:互联网 发布:陆维开料软件 编辑:程序博客网 时间:2024/06/05 16:07
之前看了一点WPF二维动画的开发,通过对各种Transform和Animation的组合,可以设计出各种非常炫的动画效果,我是个艺术白痴,所以就不敢奢望设计出多么好的动画效果。但是,我却在想一个问题,如果我们可以提供一个WPF动画库,任何WPF应用程序都可以非常轻松的重用该动画库里面的动画,那应该是比较爽的一件事。既然有了想法,那就试试,结果还真被我捣鼓出一点小东西出来,写出来跟大家分享一下。
基本思路:
1. 接口尽可能简单,只需要制定要执行动画的控件和动画的类型即可。
2. 根据动画类型来决定对应的Storyboard和Transform。
3. 根据动画类型决定Transform的位置、大小等。
4. Storyboard和Transform保存在独立的ResourceDictionary中,动态加载。
5. 将AnimationProvider设计为单件,避免多份使用。
代码很简单,大概如下,有兴趣跑起来就可以用。
using System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows;
usingSystem.Windows.Media.Animation;
usingSystem.Windows.Media;
namespace YmyCodes.Controls
{
public enum AnimationTypes
{
Rotate1,
Rotate2,
}
public class AnimationProvider
{
private AnimationProvider()
{
m_AnimationStoryboards = newResourceDictionary();
m_AnimationStoryboards.Source = new Uri("/YmyCodes.Controls;component/Themes/Animation.xaml",
UriKind.RelativeOrAbsolute);
}
private staticAnimationProvider m_Instance = null;
private ResourceDictionarym_AnimationStoryboards;
public staticAnimationProvider Instance
{
get
{
if(m_Instance == null)
{
m_Instance = newAnimationProvider();
}
returnm_Instance;
}
}
public boolDoStoryboard(FrameworkElement ele, AnimationTypes aniType, ActioncompleteCallback =null)
{
Transform grpBack =ele.RenderTransform;
TransformGroup grp =GetTransformGroup(aniType, ele.ActualWidth, ele.ActualHeight);
ele.RenderTransform = grp;
Storyboard sb =GetStoryboard(aniType);
if (sb != null)
{
Storyboard.SetTarget(sb,ele);
sb.Completed += newEventHandler((obj,arg) =>
{
ele.RenderTransform =grpBack;
if(completeCallback !=null)
{
completeCallback();
}
});
sb.Begin();
returntrue;
}
return false;
}
private TransformGroupGetTransformGroup(AnimationTypes aniType,double width, doubleheight)
{
switch (aniType)
{
caseAnimationTypes.Rotate1:
caseAnimationTypes.Rotate2:
TransformGroupgrp = (m_AnimationStoryboards["Rotate1TranGroup"]asTransformGroup).Clone();
ScaleTransformscaleTran = grp.Children[0]as ScaleTransform;
scaleTran.CenterX = width /2;
scaleTran.CenterY = width /2;
RotateTransformrotateTran = grp.Children[1]as RotateTransform;
rotateTran.CenterX = height/ 2;
rotateTran.CenterY = height/ 2;
returngrp;
default:
returnnull;
}
}
private StoryboardGetStoryboard(AnimationTypes aniType)
{
switch (aniType)
{
caseAnimationTypes.Rotate1:
return(m_AnimationStoryboards["Rotate1Storyboard"]asStoryboard).Clone();
caseAnimationTypes.Rotate2:
return(m_AnimationStoryboards["Rotate2Storyboard"]asStoryboard).Clone();
default:
returnnull;
}
}
}
}
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TransformGroup x:Key="Rotate1TranGroup">
<ScaleTransform ScaleX="1" ScaleY="1"/>
<RotateTransform Angle="0"/>
</TransformGroup>
<Storyboard x:Key="Rotate1Storyboard">
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
From="0.2" To="1" Duration="0:0:2.5">
</DoubleAnimation>
<DoubleAnimation
Storyboard.TargetProperty="RenderTransform.Children[1].Angle"
From="70" To="0" Duration="0:0:2">
</DoubleAnimation>
<DoubleAnimation
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
From="0" To="1" Duration="0:0:2"
AccelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
From="0" To="1" Duration="0:0:2"
AccelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
To="0.98" BeginTime="0:0:2" Duration="0:0:0.05"
DecelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
To="0.98" BeginTime="0:0:2" Duration="0:0:0.05"
DecelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
To="1" BeginTime="0:0:2.05" Duration="0:0:0.2"
AccelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
To="1" BeginTime="0:0:2.05" Duration="0:0:0.2"
AccelerationRatio="1">
</DoubleAnimation>
</Storyboard>
<Storyboard x:Key="Rotate2Storyboard">
<DoubleAnimation
Storyboard.TargetProperty="RenderTransform.Children[1].Angle"
To="360" Duration="0:0:1.5">
</DoubleAnimation>
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
To="0" Duration="0:0:3">
</DoubleAnimation>
<DoubleAnimation
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
To="0" Duration="0:0:1.5" AccelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
To="0" Duration="0:0:1.5" AccelerationRatio="1">
</DoubleAnimation>
</Storyboard>
</ResourceDictionary>
- WPF Animation Provider
- WPF Animation Provider
- WPF DataTemplate_DataTrigger Animation
- wpf MarginProperty Animation
- WPF rotate animation
- Context-Sensitive Help Provider in Wpf
- [WPF] WPF User Controller with rotation and animation
- provider
- <provider>
- Provider
- wpf animation 移动控件,真有这么难找么?
- WPF Animation - 如何创建一个简单的动画
- wpf动画——缓动动画Animation Easing
- Animation test (Silverlight (WPF/e) vs DHTML vs Flash vs WPF vs Apollo)
- animation
- animation
- Animation
- Animation
- SVN常用命令
- Make Linux faster and lighter
- 关于path_alloc函数(APUE)
- rqnoj-669
- 泛型笔记
- WPF Animation Provider
- confirm的运用
- 项目日程----01
- web应用插件化
- ubuntu开启SSH服务
- 找零钱问题(C语言实现)——贪心算法应用(1)
- 调用【直接或间接】打电话和发短信、收短信接口、发Email (Call, Dial, SMSManager, Broadcast, Email)
- 删除Cookie
- C#读写文件总结