[UWP-小白日记13]Composition动画

前言

  首先,来对比下传统动画和Composition动画。看图就能明白composition动画的优势太明显就像官方说的大幅度的降低了动画的实现难度和代码量。

  传统的动画,就拿最常见的就是过度动画:进入和退出,如果你的动画很复杂,那代码量简直酸爽。而且这个动画在被执行期间又被你执行了,处理不当,就duang!duang!的给你报错提示要执行就得停止前面的动画。

现在Composition动画完美解决了这个问题。进入过度效果我顺序播放一次,退出过度效果我反序播放一次就搞定了。妈妈再也不用担心我的动画了。亲,这还是可以N飞的哟!!

1.Composition旋转动画

第一步:创建一个Composition

       var composition = ElementCompositionPreview.GetElementVisual(this).Compositor;

第二步:创建动画

       //--------------------------------------------------------------------
            // 1.创建一个ScalarAnimation和一个线性缓动函数。
            //--------------------------------------------------------------------
            var animation = composition.CreateScalarKeyFrameAnimation();
            var easing = composition.CreateLinearEasingFunction();

            //--------------------------------------------------------------------
            // 1.设置动画,从0度旋转360度,3秒钟,重复播放
            //--------------------------------------------------------------------
            animation.InsertKeyFrame(0.0f,0.0f);
            animation.InsertKeyFrame(1.0f,360.0f,easing);
            animation.Duration = TimeSpan.FromMilliseconds(3000);
            animation.IterationBehavior = AnimationIterationBehavior.Forever;

第三部:开始动画

       //--------------------------------------------------------------------
            // 1.获取button的Visual
            // 2.开始动画,中心旋转
            //--------------------------------------------------------------------
            var buttonVisual = ElementCompositionPreview.GetElementVisual(AnimatingButton);
            buttonVisual.CenterPoint = new Vector3((float)AnimatingButton.ActualWidth/2.0f,(float)AnimatingButton.ActualHeight/2.0f,0.0f);
            buttonVisual.StartAnimation(nameof(buttonVisual.RotationAngleInDegrees),animation);

  

2.Composition动画正序和反序播放,并行执行动画。

1.正反序播放动画

  其实就是在上次的代码上修改了下。首先声明改了下范围。

public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();

            Loaded += (s, a) =>
            {
                InitComposition();
            };

        }

        Compositor composition;
        ScalarKeyFrameAnimation animation;
        Visual buttonVisual;
        SpriteVisual visual;
        private void InitComposition()
        {
            //--------------------------------------------------------------------
            // 1.获取当前的对象的可视化对象用来创建复合器
            // 2.创建一个SpriteVisual,用它来承载我们的Content和Brush
            //--------------------------------------------------------------------
            composition = ElementCompositionPreview.GetElementVisual(this).Compositor;    <----这个地方的this就是要用来做动画的对象,你要给谁做动画和特效就要获取它
            visual = composition.CreateSpriteVisual();
            //--------------------------------------------------------------------
            // 1.我们要设置visual的大小为150*150
            // 2.另外我们设置它的偏移为50,50
            // 注意这个偏移是相对于它的父来说的。
            // 3.最后我们设置Bursh到这个visual上,填充任意颜色。
            //--------------------------------------------------------------------
            visual.Size = new Vector2(150, 150);
            visual.Offset = new Vector3(50, 50, 0);
            visual.Brush = composition.CreateColorBrush(Colors.Black);
            //--------------------------------------------------------------------
            // 这个方法用来把我们的visual设置到page上
            //--------------------------------------------------------------------
            ElementCompositionPreview.SetElementChildVisual(this,visual);
            //--------------------------------------------------------------------
            // 1.创建一个ScalarAnimation和一个线性缓动函数。
            //--------------------------------------------------------------------
            animation = composition.CreateScalarKeyFrameAnimation();
            var easing = composition.CreateLinearEasingFunction();
            //--------------------------------------------------------------------
            // 1.开动画,从0度旋转360度,3秒钟,重复播放
            //--------------------------------------------------------------------
            animation.InsertKeyFrame(0.0f, 0.0f);
            animation.InsertKeyFrame(1.0f, 360.0f, easing);
            animation.Duration = TimeSpan.FromMilliseconds(3000);
            animation.IterationBehavior = AnimationIterationBehavior.Forever;
            //--------------------------------------------------------------------
            // 1.创建一个旋转的中心点。
            // 2.设置动画要操作的属性,这里旋转当然是角度
            // 注意这里使用的是nameof(),就避免了某些方法设置目标属性使用字符串而导致不能智能提示的问题
            //--------------------------------------------------------------------
            visual.CenterPoint = new Vector3(visual.Size.X/2.0f,visual.Size.Y/2.0f,0);
            visual.StartAnimation(nameof(visual.RotationAngleInDegrees),animation);
            //--------------------------------------------------------------------
            // 1.获取button的Visual
            // 2.开始动画            // 3.ElementCompositionPreview.GetElementVisual(合成器对象)

            //-------------------------------------------------------------------- buttonVisual = ElementCompositionPreview.GetElementVisual(AnimatingButton); <----这个地方同样的道理,你要给谁做动画和特效就要获取它
buttonVisual.CenterPoint = new Vector3((float)AnimatingButton.ActualWidth / 2.0f, (float)AnimatingButton.ActualHeight / 2.0f, 0.0f); //-------------------------------------------------------------------- // 创建一个组执行动画 //-------------------------------------------------------------------- CompositionScopedBatch csb = composition.CreateScopedBatch(CompositionBatchTypes.Animation); buttonVisual.StartAnimation(nameof(buttonVisual.RotationAngleInDegrees), animation); visual.StartAnimation(nameof(visual.RotationAngleInDegrees), animation); csb.End(); }

  在上次的代码的按钮上添加点击事件。大家看上面的代码就知道从头到尾就只有一个名字为animation的标量关键帧动画。

     /// <summary>
        /// 正向和反向执行动画
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void AnimatingButton_Click(object sender, RoutedEventArgs e)
        {
            if (animation.Direction==Windows.UI.Composition.AnimationDirection.Normal)
            {
                animation.Direction = Windows.UI.Composition.AnimationDirection.Alternate;
            }
            else
            {
                animation.Direction = Windows.UI.Composition.AnimationDirection.Normal;
            }
            buttonVisual.StartAnimation(nameof(buttonVisual.RotationAngleInDegrees), animation);
            visual.StartAnimation(nameof(visual.RotationAngleInDegrees), animation);
        }

时间: 2024-12-24 08:08:05

[UWP-小白日记13]Composition动画的相关文章

小白日记13:kali渗透测试之服务扫描(三)-SMTB扫描、防火墙识别、负载均衡识别、WAF识别

SMTP扫描 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地.通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟.SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件. SMB扫描针对机器去发现其漏洞,SMTP扫描为主动发现目

[UWP小白日记-3]记账项目-1

学了一段时间的UWP,来个项目试试手. 本来是想边做边学MVVMLight的结果感觉MVVM对于萌新来说太高难,以后再把这个项目改造成MVVMLight框架的项目. 下面进入正题. 中间那快空白打算放gridview,用来放标签.利用DataTemplate读取数据库里的标签表. 头部标题和底部标签没什么好说的,主要说下那个pivot的实现. 先来看看图,就知道有什么问题了,然后在解决这个问题. 鼠标点最左边尽然也能跳转页面,这什么鬼,改了他的默认Styel一样不行. 1 <Style x:Ke

[UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)

前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Entity Framework Core(Entity Framework 7)下文将简称:EF 1.在UWP中使用EF需要更新Microsoft.NETCore.UniversalWindowsPlatform到大于“5.2.2”的版本. 2.直接在“程序包管理器控制台”输入命令来更新:Update-P

[UWP小白日记-2]SQLite数据库DOME

数据库说简单点就是增删改查,但是对新手来说也是要爆肝的.作为一个新手爆肝无数次啊, 血的教训啊现在UWP的教程又少,说多了都是泪.留下来免得以后又爆肝.还有:一定要写注释!一定要写注释!一定要写注释! 重要的事情说三遍! 1.首先,准备工作: 1)引用: 获取途径:VS里的扩展和更新.NuGet等. 2)数据库模型: 1 internal class ACCOURT 2 { 3 public ACCOURT() { } //空构造函数 4 public ACCOURT(int ID,double

[UWP小白日记-15]在UWP手机端实时限制Textbox的输入

说实话重来没想到验证输入是如此的苦逼的一件事情. 网上好多验证都是在输入完成后再验证,我的想法是在输入的时候就限制输入,这样我就不用再写代码来验证了 应为是手机端,所以不用判断其他非法字符,直接把Textbox的属性InputScope设置为"Number"就是了,反正在目前版本的UWP中纯数字键盘还无法切换到其他的字符键盘去 下面的代码是一个金额文本框的验证,算是抛砖引玉吧.欢迎还有更好的方案指点! 直接上代码: /// <summary> /// 检查输入金额,当检测到

[UWP小白日记-1]判断APP是否是第一次运行初始化SQLITE数据库

利用应用程序设置来实现此功能. 1.首先,获取APP设置的容器: ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings; 由于获取容器的时候并没有给key为FirestStart的赋值,所以下面就直接判断是不是为null,为null就是第一次运行APP, 然后在else里给key为FirestStart的赋值,那么else的代码就只能执行一次了.当然以后在UI上可以添加一个switchButt

[UWP小白日记-7]转换MVA学院的XML字幕为SRT (二)

瞎扯淡 上个版本,非常蠢用来N多的循环导致非常卡性能烂得不行,这次使用XmlDocument类来读取XML字幕 其实根本不用各种扒XML字幕,好吧我这是学习使用XmlDocument类,嗯就是这个样子的.(⊙﹏⊙)b , 正文 其实这个小程序,关键就是读取文件的时候要正确的转码,应为系统TXT文本默认使用的是ANIS编码,而XmlDocument使用的是UTF8. 不转码妥妥的乱码. 先来看下成品,最后我会打包为APP供大家使用的.(GIF录制工具ScreenToGif,开源并且使用的是WPF开

[UWP小白日记-3]记账项目-2

手机端: PC端: 待续……

[UWP小白日记-14]正则表达式

匹配浮点数: ^(([1-9]+[0-9]*.{1}[0-9]+)|([0].{1}[1-9]+[0-9]*)|([1-9][0-9]*)|([0][.][0-9]+[1-9]*))$ 匹配2位浮点数:^(([1-9]+[0-9]*.{1}[0-9]{1,2})|([0].{1}[1-9]+[0-9]{1,2})|([1-9][0-9]{1,2})|([0][.][0-9]+[1-9]{1,2}))$ 来自为知笔记(Wiz)