公司动态
WPF 四种动画类型
WPF 动画体系更准确的划分是四大类路径动画PathAnimation实际上是关键帧/非关键帧动画的一种特殊输入源而非与属性动画、关键帧动画并列的独立大类。以下是 WPF 官方文档和社区公认的完整分类✅ WPF 动画四大类类别基类核心特征典型代表1. From/To/By 动画基础属性动画XxxAnimation指定起点/终点/偏移量线性或缓动插值DoubleAnimation,ColorAnimation,PointAnimation2. 关键帧动画XxxAnimationUsingKeyFrames通过多个 KeyFrame定义时间轴上的离散/样条/线性段DoubleAnimationUsingKeyFrames,ObjectAnimationUsingKeyFrames3. 路径动画XxxAnimationUsingPath沿Geometry 路径提取 X/Y/Angle/Tangent 驱动属性DoubleAnimationUsingPath,PointAnimationUsingPath,MatrixAnimationUsingPath4. 基于时间的自定义动画Timeline/AnimationTimeline完全自定义插值逻辑重写GetCurrentValueCore自定义QuaternionAnimation,ThicknessAnimation等⚠️纠正点你提到的属性动画这个术语在 WPF 中并不标准。From/To/By 动画和关键帧动画都是对依赖属性做动画它们都属于属性动画的范畴。真正的区分维度是插值方式而非是否针对属性。四类详解与关系1. From/To/By 动画最简单DoubleAnimationStoryboard.TargetPropertyOpacityFrom0To1Duration0:0:1EasingFunction{StaticResource EaseOut}/只需 2 个值即可定义完整动画支持EasingFunction实现非线性局限只能描述从A到B的单段过渡2. 关键帧动画最灵活DoubleAnimationUsingKeyFramesDuration0:0:3LinearDoubleKeyFrameValue0KeyTime0:0:0/SplineDoubleKeyFrameValue100KeyTime0:0:1KeySpline0.5,0 0.5,1/DiscreteDoubleKeyFrameValue50KeyTime0:0:2/EasingDoubleKeyFrameValue0KeyTime0:0:3EasingDoubleKeyFrame.EasingFunctionBounceEaseEasingModeEaseOut//EasingDoubleKeyFrame.EasingFunction/EasingDoubleKeyFrame/DoubleAnimationUsingKeyFrames三种 KeyFrame 类型Linear线性、Spline贝塞尔曲线、Discrete阶跃跳变、Easing缓动函数可混合使用不同类型的 KeyFrameObjectAnimationUsingKeyFrames是唯一能对非数值类型如 Visibility、Brush做动画的方式3. 路径动画几何驱动PathGeometryx:KeyMotionPathPathFigureStartPoint0,0BezierSegmentPoint1100,0Point2200,100Point3300,50//PathFigure/PathGeometryDoubleAnimationUsingPathStoryboard.TargetProperty(UIElement.RenderTransform).(TranslateTransform.X)PathGeometry{StaticResource MotionPath}SourceXDuration0:0:3/Source 枚举X,Y,Angle,NormalAngle本质上是把 Geometry 作为参数化曲线的输入源输出仍是 double/Point/Matrix仅支持double、Point、Matrix三种目标类型4. 自定义动画扩展机制publicclassGradientStopOffsetAnimation:AnimationTimeline{publicoverrideTypeTargetPropertyTypetypeof(double);protectedoverrideFreezableCreateInstanceCore()newGradientStopOffsetAnimation();protectedoverrideobjectGetCurrentValueCore(objectdefaultOriginValue,objectdefaultDestinationValue,AnimationClockanimationClock){doubleprogressanimationClock.CurrentProgress??0;// 完全自定义的插值逻辑returnMath.Sin(progress*Math.PI)*0.8;}}当内置动画无法满足需求时使用必须继承AnimationTimeline并重写GetCurrentValueCore正确的分类思维导图WPF 动画体系 │ ├── 按插值方式分官方推荐分类 │ ├── From/To/By 动画 ──────── 单段平滑过渡 │ ├── 关键帧动画 ──────────── 多段时间轴控制 │ ├── 路径动画 ────────────── 几何路径驱动 │ └── 自定义动画 ──────────── 完全自主插值 │ ├── 按数据类型分 │ ├── Double / Color / Point / Thickness / Size / ... │ ├── Object仅关键帧 │ └── Matrix / Quaternion / Rotation3D │ └── ❌ 不推荐的分类 └── 属性动画 vs 关键帧 vs 路径 ← 维度混淆 实用建议场景推荐类型简单淡入/滑动/缩放From/To/By EasingFunction复杂运动轨迹、多阶段状态切换关键帧动画沿曲线/形状移动元素路径动画对枚举/Visibility/Brush 做动画ObjectAnimationUsingKeyFrames内置类型不够用自定义 AnimationTimeline