自定义转换器
注意
由于本节内容暂缺少足够的经验积累和实践验证,因此本部分的 API 可能会随时发生变化。
在实践的过程中,我们会发现并非所有的属性都是原子的。某些属性可能由更小的属性组成,如:
- 颜色:从直观上看,RGB 空间中包含 RGB 三个轴;YUV 空间上包含 YUV 三个轴。不同的空间中有不同的处理方式。
- 坐标:在2维中,由 X 和 Y 组成。
此外,还有一些属性的变化方式具有高度的非线性,或依赖于特定的上下文或数据结构(如路径动画),就难以通过简单的线性插值实现。
甚至我们可能会因为在 .Milease()
中大量针对某一种类型的动画插入了过多相同的 handleFunction
而感到麻烦。 因此,
我们就需要使用自定义转换器来定义属性如何在不同状态之间进行插值或映射,从而实现更精确或更自然更方便的动画效果。
使用
编写一个转换器
public class MyTransformation : ITransformation
{
public bool CanTranslate<E>()
{
var type = typeof(E);
if (type == typeof(int))
{
// 假设我这里只处理 int 类型
return true;
}
return false;
}
public MileaseHandleFunction<T, E> MakeTransformation<T, E>(BlendingMode blendingMode)
{
// 假设我这里其实什么都没做
return e =>
{
var progress = e.Progress;
var ani = e.Animation;
var startValue = (ani.StartValue as int?)!;
var toValue = (ani.ToValue as int?)!;
var result = startValue + (toValue - startValue) * progress;
e.Animation.ValueSetter.Invoke(e.Target, (E)(object)result);
};
}
}
注册一个转换器
TransformationManagerHolder.TransformationManager.Register(new MyTransformation());
此后,Milease 的动画构建过程中,只要没指定 handleFunction
,都会从这里尝试使用你注册过的 ITransformation
来进行处理。
内置状态转换器
为了方便使用,Milease 内置了一定量的转换器。
颜色转换器:Milease 内置了 OKLCH 空间中的颜色补间方案,以提供在视觉效果上更平滑的颜色变化动画。