动画分类和动画原理
- View Animation
- 补间动画Tween Animation :旋转、渐变、移动、缩放,使用Matrix的计算中间路径的效果
- 逐帧动画Frame Animation[Drawable Animation]:顺序播放事先做好的图像,是一种画面转换动画
- Property Animation 属性动画
- 单个绘制过程【animateValue()】为:计算出当前进度((currentTime - mStartTime) / mDuration),将所得值交给插值器计算得出新的进度值,evaluator(估值算法)根据新的进度值计算出当前进度的属性动画的值,通过反射机制进行设置
- 判断是否完成,重复单个绘制过程
插值器Interolator
名称 | 属性 |
---|
AccelerateDecelerateInterolator | 先加速后减速,开始结束时慢,中间加速 |
AccelerateInterpolator | 加速,开始时慢中间加速 |
DecelerateInterpolator | 减速,开始时快然后减速 |
AnticipateInterpolator | 反向 ,先向相反方向改变1段再加速播放 |
AnticipateOvershootInterpolator | 反向加超出,先向相反方向改变,再加速播放,会超越目的值然后缓慢移动至目的值 |
BounceInterpolator | 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能顺次为85,77,70,80,90,100 |
CycleIinterpolator | 循环,动画循环1定次数,值的改变成1正弦函数:Math.sin(2 * mCycles * Math.PI * input) |
LinearInterpolator | 线性,线性均匀改变 |
OvershottInterpolator | 超出,最后超越目的值然后缓慢改变到目的值 |
TimeInterpolator | 1个接口,允许你自定义interpolator,以上几个都是实现了这个接口 |
补间动画写法
XMLCode | JavaCode | 注释 |
---|
alpha | AlphaAnimation | 渐变动画效果 |
scale | ScaleAnimation | 渐变尺寸伸缩动画效果 |
translate | TranslateAnimation | 画面转换位置移动动画效果 |
rotate | RotateAnimation | 画面转移旋转动画效果 |
类型 | Code | 注释 | 单位 |
---|
公共 | android:shareInterpolator | 是否共享插入器 | 共享时,四个子节点都用一个插入器 |
公共 | android:interpolator | 指定一个动画的插入器 | 使用系统资源 |
公共 | android:fillEnabled | | 当设置为true时,fillAfter和fill, Befroe将会都为true,此时会忽略fillBefore 和fillAfter两种属性 |
公共 | android:fillAfter | 该动画转化是否在动画结束后被应用 | boolean |
公共 | android:fillBefore | 该动画转化是否在动画开始前被应用 | boolean |
公共 | android:repeatMode | 重复模式 | “restart” 或者 “reverse” |
公共 | android:repeatCount | 重复次数 | integer |
公共 | android:duration | 动画持续时间 | integer 时间以毫秒为单位 |
公共 | android:startOffset | 动画时间间隔 | long |
公共 | android:zAdjustment | 定义动画z order的变换 | [normal] or [top] or [bottom] |
渐变 | android:fromAlpha | 动画起始时透明度 | (浮点型)0.0表示完全透明 1.0表示完全不透明 |
渐变 | android:toAlpha | 属性为动画结束时透明度 | (浮点型) |
尺寸 | android:fromXScale | 动画起始时 X坐标上的伸缩尺寸 | (浮点型) |
尺寸 | android:toXScale | 动画结束时 X坐标上的伸缩尺寸 | (浮点型) |
尺寸 | android:fromYScale | 动画起始时Y坐标上的伸缩尺寸 | (浮点型) |
尺寸 | android:toYScale | 动画结束时 Y坐标上的伸缩尺寸 | (浮点型) |
尺寸 | android:pivotX | 动画相对于物件的X坐标的开始位置 | 从0%-100%中取值50%为物件的X或Y方向坐标上的中点位置 |
尺寸 | android:pivotY | 动画相对于物件的Y坐标的开始位置 | 从0%-100%中取值50%为物件的X或Y方向坐标上的中点位置 |
移动 | android:fromXDelta | 属性为动画起始时 X坐标上的位置 | (整型) |
移动 | android:fromYDelta | 属性为动画起始时 Y坐标上的位置 | (整型) |
移动 | android:toXDelta | 动画结束时 X坐标上的位置 | (整型) |
移动 | android:toYDelta | 动画结束时 Y坐标上的位置 | (整型) |
旋转 | android:fromDegrees | 动画起始时物件的角度 | (整型) |
旋转 | android:toDegrees | 动画结束时物件旋转的角度 可以大于360度 | (整型)当角度为负数——表示逆时针旋转;当角度为正数——表示顺时针旋转 |
旋转 | android:pivotX | 动画相对于物件的X坐标的开始位置 | 从0%-100%中取值50%为物件的X或Y方向坐标上的中点位置 |
旋转 | android:pivotY | 动画相对于物件的Y坐标的开始位置 | 从0%-100%中取值50%为物件的X或Y方向坐标上的中点位置 |
示例代码
<alpha
android:duration="1000"
android:fromAlpha="0.0"
android:toAlpha="1.0" >
</alpha>
<scale
android:duration="1000"
android:fillAfter="false"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.4"
android:toYScale="1.4" >
</scale>
<translate
android:duration="2000"
android:fromXDelta="30"
android:fromYDelta="30"
android:toXDelta="-80"
android:toYDelta="300" >
</translate>
<rotate
android:duration="3000"
android:fromDegrees="0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="+350" >
</rotate>
属性动画写法
名称 | 属性 | 备注 |
---|
android:ordering | 子动画启动方式 | sequentially:动画按照先后顺序 together (default) :动画同时启动 |
android:propertyName | 执行动画的属性 | alpha,backgroundColor等 |
android:duration | 动画执行时间 | eg:1000 |
android:valueFrom | 起始状态 | float、int、color |
android:valueTo | 终止状态 | float、int、color |
android:valueType | 关键参数 | [“intType”,”floatType”] |
android:repeatCount | 重复次数 | ”-1“表示无限循环,”1“表示动画在第一次执行完成后重复执行一次,也就是两次,默认为0,不重复执行 |
android:repeatMode | 重复模式 | “reverse”会使得按照动画向相反的方向执行,可实现类似钟摆效果。“repeat”会使得动画每次都从头开始循环 |
示例代码
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
R.anim.property_animator)
set.setTarget(myObject)
set.start()
<set
android:ordering=["together" | "sequentially"]>
<objectAnimator
android:propertyName="string"
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]>
</objectAnimator>
<animator
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
<set>
...
</set>
</set>
ViewPropertyAnimator
可以更加简单的给View添加动画
view.animate().translationX(100f).translationY(100f).scaleX(2.0f).scaleY(2.0f).withLayer()
+ withStartAction 动画开始
+ withEndAction 动画结束
Layout animation 布局动画
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="30%"
android:animationOrder="reverse"
android:animation="@anim/slide_right"/>
android:delay表示动画播放的延时,既可以是百分比,也可以是float小数。
android:animationOrder表示动画的播放顺序,有三个取值normal(顺序)、reverse(反序)、random(随机)。
android:animation指向了子控件所要播放的动画。