ObjectAnimator 属性动画
方法:
//第一个参数:指定执行动画的控件,第二个参数:指定控件的属性,第三个参数是可变长参数
//propertyName:alpha(透明)、rotationX(围绕x轴旋转)、rotationY(围绕y轴旋转)、rotation(围绕z轴旋转)、
//translationX(在x轴上平移)、translationY(在y轴上平移)、scaleX(在x轴缩放)、scaleY(在y轴上缩放)
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)
ObjectAnimator动画原理:根据属性值拼装成对应的set函数的名字,比如”scaleY”的拼接方法就是将属性的第一个字母强制大写后,与set拼接,也就是setScaleY,然后通过反射找到对应控件的setScaleY(float scaleY)函数,将当前数字值作为setScaleY(float scale)的参数将其传入。属性值得首字母大小写都可以,最终都会被强转成大写。View中都已经实现了相关的alpha rotation translate scale相关的set方法。
在自定义的动画中,要设置相对应的setter、getter方法,不然动画是不会执行的。
xml自定义动画
android:duration 动画持续时间,以毫秒为单位
android:fillAfter 如果设置为true,控件动画结束时,将保持动画最后时的状态
android:fillBefore 如果设置为true,控件动画结束时,还原到开始动画前的状态
android:fillEnabled 与android:fillBefore 效果相同,都是在动画结束时,将控件还原到初始化状态
android:repeatCount 重复次数
android:repeatMode 重复类型,有reverse和restart两个值,reverse表示倒序回放,restart表示重新放一遍,
必须与repeatCount一起使用才能看到效果。因为这里的意义是重复的类型,即回放时的动作。
android:interpolator 设定插值器,其实就是指定的动作效果,比如弹跳效果等,不在这小节中讲解,后面会单独列出一单讲解。
1、设置xml时,里面有些数值的含义,例如scale的pivotX,可以为50,50%,50%p
数值 | 含义 |
---|---|
50 | view左上角加50像素 |
50% | 左上角加上自己宽度的50% |
50%p | (p代表parent,即父控件)左上角加上父控件宽度的50% |
2、通过Animation scaleAnimation = AnimationUtils.loadAnimation(this, R.anim.scaleanim)
;从XML文件中获取动画
ViewPropertyAnimator
用法很简单:view.animate().动画的方法()
,例如translateX()、scaleX()、rotate()等等,此方法是Android 3.0 加入的
Interpolator 插值器
在动画中改变动画效果的属性,通过setInterpolator()来设置想要的动画效果
现有的插值器介绍:
插值器名称 | 效果 |
---|---|
AccelerateDecelerateInterpolator | 默认的插值器,效果是从速度为 0 开始逐渐加速,然后再逐渐减速直到 0 |
LinearInterpolator | 匀速的 |
AccelerateInterpolator | 持续加速 |
DecelerateInterpolator | 持续减速到0 |
AnticipateInterpolator | 先回拉一下再进行正常动画轨迹 |
OvershootInterpolator | 动画会超过目标值一些,然后再弹回来 |
AnticipateOvershootInterpolator | 开始前回拉,最后超过一些然后回弹。上面两个的结合版 |
BounceInterpolator | 在目标值处弹跳,直到0 |
CycleInterpolator | 一个正弦 / 余弦曲线的运动,根据构造里的参数 new CycleInterpolator(float cycles) 来决定运动周期,例如:0.25f,到最远处;0.5f,到最远处又回到起点 |
PathInterpolator | 自定义动画完成度 / 时间完成度曲线 |
自定义的PathInterpolator,其实就是画一个Path,图片运行的速度就是你图形那个时间点的斜率,斜率越大,速度越快,反之,则越小。使用自定义的Path的时候,有一点要切记,同一时间点对应的path,只能有唯一的对应的一种状态,且不能断点,否则会NG,画个图理解下:
时间横轴对应的状态纵轴有且只有一个点,这种是正确的。
时间横轴对应的状态纵轴有两种状态,或者否个时间点,没有对应的状态,这种会造成程序FC。
ValueAnimator 属性动画
用做数字的变化居多,方法也不多
ValueAnimator animator = ValueAnimator.ofInt(0,400);
animator.setDuration(1000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 数据实时改变
int curValue = (int)animation.getAnimatedValue();
}
});
animator.start();