热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WPF动画1

动画的基础动画是WPF的核心部分,随着对窗体程序体验的要求增加,动画表现越来越重要,WPF天生就是基于图形的,所以天生具有动画的基因,我们常说的动画,无非就三种方式实现:逐帧动画逐
  1. 动画的基础

动画是WPF的核心部分,随着对窗体程序体验的要求增加,动画表现越来越重要,WPF天生就是基于图形的,所以天生具有动画的基因,我们常说的动画,无非就三种方式实现:

  1. 逐帧动画

逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在"连续的关键帧"中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。这就和我们的动画片的原理差不多,假如做过FLASH的人,估计对这个比较熟悉。

WPF 动画1

  1. 线性插值

线性插值,也就是给定初始点集合和终止点集合,然后给定一个映射关系。对一一对应的点的位置,即对坐标、尺寸等进行线性插值的动画。

WPF 动画1

  1. 路径动画

路径动画也属于线性插值的一种特殊类型,只是其明确指定了一个运行路径

  1. 时间轴Timeline

Timeline翻译过来就是所谓的时间轴,每个动画,都是在一定时间区间内运行,这个时间区间就是时间轴,时间轴能够控制动画的运行速度和运行长度等特征。

  1. WPF简单动画

WPF比较简单的动画,就是线性插值动画,其主要是通过改变元素的依赖属性实现的动画,但是这里要注意一个问题,就是实现修改依赖属性的动画,需要注意这些属性所对应的类型动画类,例如Width属于双精度类型,那么对应的动画类即为DoubleAnimation。

所以有上面这个限制,就决定了,不是所有的依赖属性都可以实现动画,只有对应类型的动画类,才可以实现动画,比如我们常用的HorizonalAlignment是一个枚举类型,其没有对应的动画类,那么就无法形成对应的动画。

  1. Animation

WPF中所有的动画类都继承自Animation,比如ColorAnimation和DoubleAnimation等,一般插值动画的命名规则就是"类型名+Animation"的方式,但是逐帧动画其主要的命名方式是"类型名+AnimationUsingKeyFrames"的形式进行命名。路径动画的主要命名规则是"类型名+AnimationUsingPath"。我们查看MSDN的System.Window.Media.Animation命名空间,可以知道WPF的动画中类繁多,如何能系统的学习这么多呢,其实只要我们掌握一个简单的DoubleAnimation,其他的基本的大同小异,记住一些基本的区别即可。因为XAML对泛型的支持不是很好,所以会造成这么多功能比较相似的动画类。我们编写第一个动画:

代码1-1_1

"Ani.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Ani"
        mc:Ignorable="d"
        Title="MainWindow" 350" 525">
    
        
    

我们定义了一个按钮,按钮触发一个点击事件,在对应的代码中,我们编写如下:

代码1-1_2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Ani
{
    /// 
    /// MainWindow.xaml 的交互逻辑
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {

            DoubleAnimation witdhAnimation = new DoubleAnimation();
            witdhAnimation.From = 100;
            witdhAnimation.To = 200;
            witdhAnimation.Duration = TimeSpan.FromSeconds(5);
            this.btn1.BeginAnimation(Button.WidthProperty, witdhAnimation);

        }
    }
}

点击按钮,就可以看到按钮从尺寸100,缓缓变成200。我们看看DoubleAnimation的几个关键属性:

From:动画的开始值,设置完成后,不管动画执行多少次,都是以动画总是以设置值开始动画。假如不想使用固定的From,可以通过编码的方式赋值,如From=this.Width等等等,读取当前的宽度,也可以赋值,忽略此属性,那么From会自动读取当前的值为起点值。

To:动画的结束值,设置完成后,动画会执行到To指定的值。To也可以为空,为空的情况下,当前动画会变化到初始化值,比如按钮宽度是50,From设置为30,To没有设定,那么动画就是从30变为50。

By:代表变化值,可以是正负,代表To-From的值,所以可以看出,By属性只适用数值类型的动画。

Duration:代表动画的运行时间,Duration是一个Duration对象,你查看其定义,就可以知道,其内部有一个隐式转换TimeSpan,所以通过TimeSpan赋值

public static implicit operator Duration(TimeSpan timeSpan);

FillBehavior:代表动画运行的行为,其有两个选项HoldEnd和Stop,HoldEnd动画结束后,控件保留To所指定的值,Stop的话,动画结束,控件会回到From指定的值。

RepeatBehavior:动画是否重复执行,其只有一个选择Forever,要么重复,要么不重复,这里属性有点鸡肋,假如我们想重复3次,就麻烦。

BeginTime:表示开始的时间,可以实现延迟执行的效果

SpeedRatio:设置动画的速度,动画的速度可以通过Duration的设定改变,为什么又要不这个属性呢。其实在有些情况还是比较有用的,比如改变动画速度,但不影像动画总时间的情况。

AccelerationRatio和DecelerationRatio :改变动画的线性运行方式,AccelerationRatio代表开始的速度,DecelerationRatio代表结束的速度,可以设置开始和结束实现线性的动态效果,AccelerationRatio和DecelerationRatio的值相加不能超过1,他们主要是设置在整个动画过程中的比例。

AutoReverse:设置动画是否反向播放,假如设置true,动画会返回到初始化值,但动画的时间同时会增加两倍。

 


推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细探讨了在Android 8.0设备上使用ChinaCock的TCCBarcodeScanner进行扫码时出现的应用闪退问题,并提供了解决方案。通过调整配置文件,可以有效避免这一问题。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
author-avatar
唯心-C_436
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有