TransformMatrix documentation说:“可以对该属性进行动画处理。调用CompositionObject.StartAnimation将其与CompositionAnimation关联。”
但是我无法创建可以针对它的CompositionAnimation。我尝试了CreateQuaternionKeyframeAnimation,然后尝试了CreateVector4KeyframeAnimation:
Visual visual = ElementCompositionPreview.GetElementVisual(myUIElement);
var animation = visual.Compositor.CreateVector4KeyFrameAnimation();
Vector4 v4 = Vector4.Transform(new Vector4(), myMatrix4x4);
animation.InsertKeyFrame(1f, v4);
animation.Duration = TimeSpan.FromMilliseconds(3000);
visual.StartAnimation(nameof(visual.TransformMatrix), animation);
可能会引发“表达式输出与动画属性类型不匹配”的错误。我不知道还能尝试什么。我是否必须创建16个单独的标量动画,每个矩阵值一个?这似乎有点疯狂。
编辑: 因此,我尝试自己滚动并使用16种标量动画,如下所示:
for (int i = 5; i <= 20; i++)
{
int row = (i / 4);
int column = (i % 4);
if (column == 0) { column = 4; }
var matrixAnimation = visual.Compositor.CreateScalarKeyFrameAnimation();
var matrixEasing = visual.Compositor.CreateLinearEasingFunction();
matrixAnimation.InsertExpressionKeyFrame(1f, "this.FinalValue", matrixEasing);
matrixAnimation.Target = nameof(visual.TransformMatrix) + ".M" + row + column;
matrixAnimation.Duration = TimeSpan.FromMilliseconds(durationMilliseconds);
visual.ImplicitAnimations[nameof(visual.TransformMatrix) + ".M" + row + column] = matrixAnimation;
}
这样就创建了隐式动画,并且看起来都很棒。令我沮丧的是,我编写了代码来更改读/写M11-M44属性,这些属性应该触发隐式动画,并且出现编译器错误:
“无法修改'Visual.TransformMatrix'的返回值,因为它 不是变量”。
并为其分配新的Matrix4x4不会触发隐式动画。