《Motion Design for iOS》(四十五)

我们现在还剩两个动画,但它们比较大,需要一些思考。我们需要将顶部的线顺时针旋转45度(所以右边向下倾斜),然后我们需要底部的线逆时针旋转45度(所以右边向上倾斜)。逆时针旋转意味着我们需要旋转一个负值,所以是-45度。当然了,动画不会接受度数值,它们需要角度值,45度在角度上是π/4。来做一些旋转动画。

// 旋转顶部的线来构成X
POPSpringAnimation *topRotate =
    [self.top.layer pop_animationForKey:@"topRotate"];

if (topRotate) {
    topRotate.toValue = @(-M_PI/4);
} else {
    topRotate =
        [POPSpringAnimation animationWithPropertyNamed:kPOPLayerRotation];
    topRotate.toValue = @(-M_PI/4);
    topRotate.springBounciness = 11;
    topRotate.springSpeed = 18.0f;
    [self.top.layer pop_addAnimation:topRotate forKey:@"topRotate"];
}

// 旋转底部的线来构成X
POPSpringAnimation *bottomRotate =
    [self.bottom.layer pop_animationForKey:@"bottomRotate"];

if (bottomRotate) {
    bottomRotate.toValue = @(M_PI/4);
} else {
    bottomRotate =
        [POPSpringAnimation animationWithPropertyNamed:kPOPLayerRotation];
    bottomRotate.toValue = @(M_PI/4);
    bottomRotate.springBounciness = 11;
    bottomRotate.springSpeed = 18.0f;
    [self.bottom.layer pop_addAnimation:bottomRotate forKey:@"bottomRotate"];
}

Pop的旋转动画时在layer上操作的(看到kPOPLayerRotation了没),所以我们将动画添加到支撑这些视图的layer上。

我们向上旋转一根线、向下旋转一根线所以它们应该在中间交叉,对吗?让我们看看我们得到了什么。



额,直观地说,这可能并不是你期待的样子。旋转动画让线条变成这样的原因是没跟线条都是围绕着它们layer的中心旋转的。所以这些视图会像跷跷板一样旋转,而不是我们想要的在中间交叉的样子。我们可以改变layer旋转的锚点,但这有点麻烦,因为这样做会重定位layer并且我们需要调整框架,这纯粹是找麻烦。所以,更简单的做法是,我们可以就将顶部线下移一点,然后将底部的线上移一旦,然后重叠它们。

// 重定位顶部的线到按钮的中间
POPSpringAnimation *topPosition =
    [self.top.layer pop_animationForKey:@"topPosition"];

if (topPosition) {
    topPosition.toValue = @(29);
} else {
    topPosition =
        [POPSpringAnimation animationWithPropertyNamed:kPOPLayerTranslationY];
    topPosition.toValue = @(29);
    topPosition.springBounciness = 0;
    topPosition.springSpeed = 18.0f;
    [self.top.layer pop_addAnimation:topPosition forKey:@"topPosition"];
}

// 重定位底部的线到按钮的中间
POPSpringAnimation *bottomPosition =
    [self.bottom.layer pop_animationForKey:@"bottomPosition"];

if (bottomPosition) {
    bottomPosition.toValue = @(-29);
} else {
    bottomPosition =
        [POPSpringAnimation animationWithPropertyNamed:kPOPLayerTranslationY];
    bottomPosition.toValue = @(-29);
    bottomPosition.springBounciness = 0;
    bottomPosition.springSpeed = 18.0f;
    [self.bottom.layer pop_addAnimation:bottomPosition forKey:@"bottomPosition"];
}

经过一些测试和试错,我决定将顶部的线下移29像素,底部的线上移29像素,这样会让它们重合的最好。你也可以做一些三角几何计算来得出这个值。我们使用kPOPLayerTranslationY动画来让两根线旋转到按钮中间的X。



完成了!很好吧?现在,当你点击按钮,它会将三根线变成两根线,但当用户再次点击时会发生什么呢?这时候,不会发生任何事情,因为我们没有实现任何其他条件分支的逻辑来将X变回三根线。幸运的是,我们可以很简单地复制粘贴动画,但是要将toValue值改为初始值。比如说,我们需要将两根线都旋转回0度,记得要移动29像素,并将它们的颜色改回白色。还有要将中间的线淡入回100%不透明。这样就全部完成了,我们得到了一个漂亮的汉堡按钮。



查看完整合集:https://github.com/Cloudox/Motion-Design-for-iOS
版权所有:http://blog.csdn.net/cloudox_

### 回答1: Motion Matching是一种用于游戏动画的技术,它可以在Unity中实现。它的基本思想是将动画片段分解成小的动作单元,然后根据玩家的输入和环境的变化来选择最合适的动作单元,从而实现更加流畅和自然的动画效果。在Unity中,可以使用Mecanim系统和动画控制器来实现Motion Matching。 ### 回答2: Motion Matching是一个基于动作捕捉和计算机图形学技术的新兴技术,在游戏开发中被广泛应用。而在Unity中,Motion Matching也是一种非常重要的技术,它可以帮助游戏开发者更加快速、高效地实现高品质的游戏动画效果。 具体来说,Motion Matching是一种通过将实时捕捉的动作与大量预先录制的动画片段进行匹配的技术。这样一来,游戏中的角色可以在不同情景下根据玩家的操作实时变换动作,使得角色的动作更加自然、流畅。同时,Motion Matching还可以通过实时计算、调整数据的方式,来实现更加精细的动画效果,例如在某个特定条件下播放某个特定动画。 在Unity中,Motion Matching不仅仅是一个技术,更是一个系统,包含了许多组件和工具。其中最重要的组件是Motion Matching Controller,它被设计为一种易于配置和调整的动画控制器,可以根据开发者的需求来调整动画、匹配以及优先级等参数。此外,Unity中还提供了一些工具和插件,用于帮助开发者更好地实现Motion Matching,例如Unity Kinematica插件、Unity Timeline等。 总的来说,Motion Matching为Unity游戏开发者提供了一个高效、灵活、自然的动画实现方法,为游戏制作提供了更多可能性。然而,Motion Matching还是一个相对新的技术,需要开发者对其进行深入的理解和应用,方能发挥其最大的效用。 ### 回答3: Motion Matching for Unity是一种运动匹配技术,可以优化角色动画表现和反应性能。该技术通过使用大量的动作片段来替代传统的动画过渡技术,使得角色的动作更加自然流畅。 Motion Matching for Unity主要基于两个核心概念:候选集和匹配器。候选集是指在角色执行动作前可以选择的所有动作片段,而匹配器是根据角色当前的状态选择最佳的动作片段并实时应用于角色。 Motion Matching for Unity的优势在于其高反应性能和可定制性。由于每个角色状态都有其独特的动作片段集合,因此在运用此技术时需要设计和构建一个丰富且复杂的动作切割器。这个切割器会将动作片段划分成更小的单位,以便根据角色状态实时匹配。 此外,Motion Matching for Unity还有其他一些优势。例如,它减少了手动动画制作的时间和精力成本,还能够实现更好的角色行进和移动。 尽管Motion Matching for Unity与传统的动画过渡技术相比具有更高的复杂性和技术门槛,但是对于需要更高动画反应性和更好的角色表现的游戏开发者来说,这种技术是非常有用的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值