力学动画DynamicAnimate

iOS 模拟轮胎滚动3D动画效果 因为项目中需要实现跑车动画效果,于是希望采用静止的跑车图和转动的轮胎来实现跑车开动效果。首先轮胎的转动要考虑到3D环境中形状的变化,不应该是纯圆形的,而应该是椭圆形。有两种方法实现这样的效果, 一是通过连续的贴图不断的替换来得到需要的滚动的动画,优点是实现简单,不断循环替换图片就能得到滚动的效果,更加贴近真实的样子,有更多的细节。但是遇到线程繁忙时将会影响动画的效果,拉长动画的持续时间;同时增加 阅读详情
力学动画DynamicAnimate

iOS7中,苹果添加了力学动画的API.它是基于Box2d实现,用来模拟现实世界的物理模型,隶属于UIKit.其中包含了重力、碰撞、推、甩、和自定义行为.

UIDynamicAnimator 相当于一个manager,用于管理所有添加的力学行为
UIDynamicBehavior 所有力学行为的父类,是一个抽象类

UIDynamicAnimator

UIDynamicAnimator属于UIKit物理引擎中的类,它的作用是跟踪你添加到物理引擎中的各种行为动作,并且提供整个上下文.

使用时需要注意:
1.UIDynamicAnimator必须是一个全局变量,如果是局部变量动画会不起作用.
2.在初始化需要绑定一个视图,而且与视图必须是一对一的关系.
3.一个animator可以添加多个behavior(但是某些类型的behavior添加后只会作用最后一种.后面会有详细说明)
4.一个behavior可以作用给多个Dynamic Item(Dynamic Item是遵循协议的对象,UIView默认遵循).

UIDynamicBehavior
behavior类型描述
UIGravityBehavior重力
UICollisionBehavior碰撞,弹力
UIAttachmentBehavior吸附力
UIPushBehavior推动
UISnapBehavior震荡
UIDynamicItemBehavior自定义

在behavior中可以指定“力”的大小和方向.在现实生活中: 1N=1kg·m/s^2,而在UIKit中,1N定义为:

# UIGravityBehavior 模拟重力
  • 注意:Animator重复添加多个此类型behavior得出的结果并不是预期效果.

使用时可以更改角度和速率属性.属性及说明:

  • gravityDirection是重力向量,有方向和大小(由vector指定,默认(0.0,1.0)).使用的坐标系为UIKit坐标系,所以默认左上角为(0,0)点,而向量的大小就是重力的大小.
  • angle是重力的方向(由弧度指定).值为0时,方块会水平向右移动,随着值的增大,方块会顺时针改变角度.不设置时默认是垂直向下移动.
  • magnitude是重力加速度值(默认情况下1000points/second^2).可以为负数,绝对值越大运动的速度越快.当magnitude属性的值为0时,方块就不会运动.

实际使用时,设置angle和magnitude会更直观方便.

但是当给一个_animator添加多个UIGravityBehavior时,效果并不是预期的那样:item按照对应的behavior执行动画.而是不管加到哪个behavior上的item都按照_animator最后添加的那个behavior来运动.所以UIGravityBehavior不可以重复添加多个.

# UICollisionBehavior 碰撞

UICollisionBehavior为Item与边界以及Item之间添加碰撞效果.它可以设置碰撞的items,路径或边界以及碰撞模式.

  • Animator可以重复添加多个此类型behavior.

碰撞模式有三种:
1.选中的items之间碰撞
2.和设定的boundary边界碰撞
3.包含上述所有的碰撞

属性方法说明:
* translatesReferenceBoundsIntoBoundary : 将UIDynamicAnimator引用的View的边界作为碰撞行为的触发边界,这样就不用再去设置边界的坐标.当item运动到边界便会停止.
* initWithItems时添加多个item,碰撞后会一起运动,并不是设置边界.
* 如果想设置障碍物作为边界,需要使用addBoundaryWithIdentifier:方法.可以指定path或point.

  UIView * view = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 100, 100)];
  view.backgroundColor = [UIColor grayColor];
[ self.view addSubview:view];

  UIView * view2 = [[UIView alloc] initWithFrame:CGRectMake(50, 300, 300, 50)];
  view2.backgroundColor = [UIColor greenColor];
  [self.view addSubview:view2];

  UIGravityBehavior *gravity2 = [[UIGravityBehavior alloc] initWithItems:@[view,view1]];
  gravity2.magnitude = 0.5;
  [_animator addBehavior:gravity2];

   UICollisionBehavior * collision = [[UICollisionBehavior alloc] initWithItems:@[view,view2]];
   //self.view作为边界.
   collision.translatesReferenceBoundsIntoBoundary = true;
   //view2作为边界.注释上的话碰触后两个view会一起下降
   [collision addBoundaryWithIdentifier:@"barrier" forPath:[UIBezierPath bezierPathWithRect:view2.frame]];
   [_animator addBehavior:collision];
  • 此behavior有代理,在物体碰撞和边界碰撞时的开始/结束碰撞事件时会调用代理.
# UIAttachmentBehavior
  • Animator可以重复添加多个此类型behavior.

为Items之间或者Item和锚点来创建吸附行为.即吸附对象可以是点或者item.

anchorPoint : 锚点.当吸附对象为item时,默认吸附item的中心点为锚点.设置offset可以更改偏移量.
length : 吸附的两个点之间的距离(锚点和Item或者Item之间)
damping : 阻尼(阻力大小)
frequency : 震荡频率

设置UIAttachmentBehavior后,运动后item中心点与锚点的直线距离是不大于设置的length的(刚性),运动最终会震然后静止.

# UIPushBehavior

给一个Item持续或者瞬间的推力,属性和重力差不多,参考重力.
* 与重力不同,Animator可以同时添加多个此类型behavior.

初始化时需要指明是瞬间还是持续的推力:持续作用(UIPushBehaviorModeContinuous)短暂作用(UIPushBehaviorModeInstantaneous)

UIOffset方法是说推力作用点的偏移量,默认是item的中心点.

# UISnapBehavior
  • Animator可以同时添加多个此类型behavior.

震荡行为定义了一个动态运动,会运动到指定point后实现震荡效果,震荡的值是可以设置的.
配置属性:
damping - 动画结束的时候的震荡值(0.0-1.0)默认0.5

力学现象动画演示——真空状态下的自由落体运动 一、实验的演示内容     演示了一个在真空状态下的自由落体运动。动画是设定在如下场景下完成的,由一个橡皮球从六百米的高空掉下来,做自由落体运动,每次撞击地面时候,小球的动能会损失一半,全部转化为小球的热能,热能体现在小球的温度上升。小球的初始温度是0摄氏度。因此小球撞击地面后又会反弹,然后上升到最高点再下降,重复撞击过程,小球温度会随着撞击地面次数的增多,不断上升。动画左边有一个温度计,显示小 阅读详情

相关推荐

Unity IK 反动力学动画 (二)

上一篇中的遗留问题是说收不回穿插身体,这一篇说说解决方案。 解决这个问题是历经了很多思路: i) 使用碰撞器,给头部和手部都添加碰撞器 ii) 动画设置权重,怎么设置不知道,但是看到unity社区说 mecanim IK not respecting muslce limits,链接如下: https://forum.unity.com/threads/mecanim-ik-not-r...

御雪妃舞 3211

DynamicAnimationExample, 一个简单的spring 动画( 支持库 v25.3.0 ) 示例 Android 应用.zip

DynamicAnimationExample, 一个简单的spring 动画( 支持库 v25.3.0 ) 示例 Android 应用 动态动画示例 动态动画是在Android的Android版本 25.3.0中引入的一个新的模块。 它提供了一组用于制作基于真实物理的视图动画的类。设置要开始,请将以下依赖项添加到模块的build.gradle 中:

利用UIDynamicanimation实现UIView布局弹簧效果

现今多数的分类布局都没有交互功能,我们可以利用苹果提供的UIDynamicanimation这个类,实现交互功能,让界面更加人性化;当然在此也吐槽一下苹果的 UICollisionBehavior类,边界有个小的BUG,当手势滑动穿过边界时,View会穿过碰撞边界;当然,给View添加一个移动范围就能避免这种BUG 在此,主要使用到的物理引擎类有: UIAttachmentBeh

分享的才是最美的 2105

基于VB开发的理论力学运动学动画制作_IT168文库

基于VB开发的理论力学运动学动画制作_IT168文库

iOS 笔记八:Core AnimationDynamic Animation、 UIDynamicBehavoir

Animation 动画 A.属性动画; B.一次进行多个动画; C.基于物理的动画。 Core Animation 是现有、强大的动画框架。 A.UIView的属性动画 属性变化是立即完成的,但是在屏幕上的显示会经过一段时间的动画变化, 等动画结束后才显示正确的属性,可以参考UIView的方法animationWithDuration:... B.UIView的任意显示

Romantic_Energy的专栏 1356

运用弹簧物理学原理为图形运动添加动画

一、前言 Android系统已经给我们提供了属性动画,ValueAnimator以及ObjectAnimator,这两个动画效果已经满足我们开发中的大多应用场景,但是基于物理特性的动画用上述的两个动画效果就很难实现,但是官方也给我们提供了运用弹簧物理学原理的动画效果库dynamicanimation,让我们在开发中快速的使用。下面的这个效果就是实际项目中基于dynamicanimation来完成的. 二、使用流程 2.1 添加支持库 implementation 'androidx.dynamicanim

mrRuby的博客 925

H5研究六:力学动画/碰撞动画

一、首先我们创建一个DIV id=”box”<body> <div id="box"></div> </body>二、设置CSS<style type="text/css"> html, body, div { margin: 0; padding:

Quinn's blog ! I'm glad to be here! 1984

什么??同事悄悄学了SpringAnimation,实现了弹性动画!!!

Android开发利用SpringAnimation实现弹性动画    在最近更新的25.3.0的支持库中,新更新了一个叫做DynamicAnimation(动力学动画??)的类,其中他有一个子类叫做SpringAnimation,官方文档是这样说的:This class is the base class of physics-based animations. It manages the an

高级复制工程师的博客 7077

iOS力学动画——DynamicAnimate

dynamicAnimate为首的力学动画是苹果在iOS7加入的API,里面包含了很多力学行为,这套API是基于Box2d实现的。其中包含了重力、碰撞、推、甩、和自定义行为。 涉及到的类如下 涉及类 描述 UIDynamicAnimator 相当于一个manager,用于管理所有添加的力学行为 UIDynamicBehavior

stubbornness1219的博客 653

iOS动画——DynamicAnimate

力学动画dynamicAnimate为首的力学动画是苹果在iOS7加入的API,里面包含了很多力学行为,这套API是基于Box2d实现的。其中包含了重力、碰撞、推、甩、和自定义行为。 涉及到的类如下 涉及类 描述 UIDynamicAnimator 相当于一个manager,用于管理所有添加的力学行为 UIDynamicBehavior 所有力学行为...

weixin_30617695的博客 146

android spring动画,DynamicAnimationExample:基于物理的逼真视图动画

Dynamic Animation Example Dynamic-animationis a new module introduced inrevision 25.3.0 of the Android Support Library. It provides a small set of classes for making realistic physics-based viewa...

weixin_29957793的博客 536

理论力学计算机模拟

本书介绍数学软件MATLAB在理论力学教学中的应用。全书分为两章,第1章简明地介绍MATLAB的基础知识,第2章将理论力学教材中精选的24个典型的线性与非线性问题进行数值求解,给出了求解过程与程序,并将结果做成模...更多>> 本书介绍数学软件MATLAB在理论力学教学中的应用。全书分为两章,第1章简明地介绍MATLAB的基础知识,第2章将理论力学教材中精选的24个典型的线性与非线性问题进行数值求解,给出了求解过程与程序,并将结果做成模拟实物运动的动画。本书用MATLAB对理论力学教材中的微分方程进行数值求解,有一定的独创性。书中大量的程序实例不仅实用,也有许多使用MATLAB的独特技巧,值得借鉴。全书将数值计算、学习MATLAB与学习理论力学融为一体。,

UIDynamicAnimator与UIDynamicBehavior(力学动画)

UIDynamicAnimator,UIDynamicBehavior

常鲜的博客 993

html5粒子效果如何实现,详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)

没有最好,只有更好,如题所示,这篇文章只要是分享一个用 Canvas 来实现的粒子运动效果。感觉有点标题党了,但换个角度,勉勉强强算是炫丽吧,虽然色彩上与炫丽无关,但运动效果上还是算得上有点点炫的。不管怎么样,我们还是开始这个所谓的炫丽效果吧!直接上代码 ,不懂可以看代码注释。估计就会看明白大概的思路了。html 代码Canvas 实现炫丽的粒子运动效果-云库前端* {margin: 0;padd...

weixin_30427953的博客 781

swift 基础之UIDynamicAnimation

class ViewController: UIViewController, UICollisionBehaviorDelegate { @IBOutlet weak var gravity: UIButton! @IBOutlet weak var push: UIButton! @IBOutlet weak var attachment: UIButton!

滴水可以穿石 百炼才能成钢,谋全局而通一域 致广大而尽精微 530

力学,手把手的搞动画

两个类~直接跑跑看撒~ // //  DLCardView.h //  dielianw // //  Created by 刘威 on 16/8/10. //  Copyright © 2016年 apple. All rights reserved. // #import @interface DLCardView : UIView @en

昀离丶的专栏 760

UIGravityBehavior-动画效果:重力自由落体

1。重力行为 2。UIDynamicAnimator             初始化:- (instancetype) initWithReferenceView : (UIView *) view  ; 3。UIGravityBehavior            初始化:- (instancetype) initWithItems : (NSArray *) items ; 4。ad

berained的专栏 4226

UIAttachmentBehavior

{    __weak IBOutlet UIImageView     *_boxImageView;        UIDynamicAnimator               *_animator;    UIAttachmentBehavior            *_attachement;}@end@implementation AttachmentViewController- ...

BianHuanShiZhe的专栏 460
上一篇: swift 中的KVO用法
下一篇: iOS响应式架构
Philm_iOS
博客等级 码龄8年 74粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值