如何对Visual.TransformMatrix进行动画处理?

时间:2018-11-13 04:42:11

标签: uwp

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不会触发隐式动画。

0 个答案:

没有答案
相关问题