2016-06-06
WXG - 基础产品部 - 设计中心 - UI开发一组
迪士尼的元老们帮我们总结了动画的十二条动画法则
任何物体自静止开始动作,是渐快的加速运动,从运动状态到静止状态,则是呈渐慢的减速运动 。
凡任何会动的生物,其组成的任何部分之运动轨迹皆为平滑的弧形曲线。
没有任何一种物体会突然停止,物体的运动是一个部分接着一个部分的
利用挤压和伸展的效果、夸大的肢体动作、或是以加快或放慢动作来加乘角色的情绪及反应。
以特体形状的变形,强调瞬间的物理现角。
加入一反向的动作以加强正向动作的张力,借以表示下一个将要发生的动作。
当设计角色时,能够以造型或独特的姿态让观众直觉角色的属性,藉以提高观众对于角色的印象,例如高矮胖瘦可分别代表不同个性的角色。
当角色在进行主要动作时,附属于角色的一些配件,或是触须、尾巴等部分,会以附属动作来点缀主要动作的效果。
角色的仪态、及表演方式,配合适当的摄影机运动,使能够有效的表达角色的特性及故事中的讯息。
前者根据连续的动作依序制作每一格画面;后者是先定义关键的主要动作,而后再制作关键动作间的画格。
一段动作发生所需的时间,这是掌控动画节奏的最基本观念。
这是在传统手绘动画领域里,对于动画师的基本需要,然而在电脑动画领域,手绘已不再是动画师的工作内容。
慢进慢出、弧形运动、惯性与重叠
夸张、挤压拉伸、预备动作、吸引力
附属动作、呈像方式、逐帧\关键帧画法、时间控制、手绘技巧
.demo img{ left: 0; transition: left .5s ease-in-out, transform .5s cubic-bezier(0.68, -0.55, 0.265, 1.55) 1s ; } .demo:hover img{ img{ left: 700px; transform: scale(1.5) } }
时间函数
.bear-crazy{ animation: bear-crazy 100ms ease-in-out; // name duration timing-function animation-iteration-count: infinite; // 播放次数 animation-direction: alternate; // 下个周期播放方向,normal }
@keyframes bear-crazy { 10% { transform: translate(-10px, -19px) rotate(6deg); opacity: 0.47 } 20% { transform: translate(-11px, 10px) rotate(5deg); opacity: 0.82 } /* ... */ 0%, 100% { /* 0%和100%一致是为了循环 */ transform: translate(0, 0) rotate(0); } }
timing-function是作用于每两关键帧之间
img{ animation: animation-demo2 2s cubic-bezier(0.86, 0, 0.07, 1) infinite alternate; } @keyframes animation-demo2{ 0%{ transform: translateX(0px); } 50%{ transform: translateX(430px); } 100%{ transform: translateX(850px); } }
<path d="M318.0094050899985......" /> <image> <animateTransform attributeName="transform" type="rotate" from="0" to="360" dur="3s" repeatCount="indefinite" calcMode="spline" keyTimes="0;1" keySplines="0.86 0 0.07 1" // timing-function /> <animateMotion path="M318.0094050899985......" dur="3s" repeatCount="indefinite" calcMode="spline" keyTimes="0;1" keySplines="0.86 0 0.07 1" /> </image>
——张鑫旭
用stroke-dasharray控制着path的实与虚。
<line stroke-dasharray="5, 5"></line> <line stroke-dasharray="5, 10"></line> <line stroke-dasharray="10, 5"></line> <line stroke-dasharray="5, 1"></line> <line stroke-dasharray="1, 5"></line> <line stroke-dasharray="0.9"></line> <line stroke-dasharray="15, 10, 5"></line> <line stroke-dasharray="15, 10, 5, 10"></line> <line stroke-dasharray="15, 10, 5, 10, 15"></line> <line stroke-dasharray="5, 5, 1, 5"></line>
stroke-dashoffset定义着dash开始的位置
<line stroke-dashoffset="0"></line> <line stroke-dashoffset="1"></line> <line stroke-dashoffset="2"></line> <line stroke-dashoffset="3"></line> <line stroke-dashoffset="4"></line> <line stroke-dashoffset="5"></line> <line stroke-dashoffset="6"></line> <line stroke-dashoffset="7"></line> <line stroke-dashoffset="8"></line> <line stroke-dashoffset="9"></line>
transition + stroke-dashoffset
100 -> 0
100 -> 200
在IOS上的表现和Android/PC不一样
window.requestAnimationFrame()
var easingFunc = easing.easeInOutCubic; // timing-function var path2d = new Path2D("M165.50942211 ..."); ctx.setLineDash([pathLength]); ctx.lineDashOffset = pathLength; function draw(){ ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.lineDashOffset = parseInt(pathLength * (1 - easingFunc(timePos))); ctx.stroke(path2d); requestAnimationFrame(draw); } draw();