1、ValueAnimator
(1)继承关系图
继承自父类Animator
(2)创建对象,一般来说,常用来创建ValueAnimator的对象为静态方法ofInt,ofFloat,ofPropertyValuesHolder,ofObject,在内部实际上也是调用相关的属性构造对象
public static ValueAnimator ofInt(int... values) { ValueAnimator anim = new ValueAnimator(); anim.setIntValues(values); return anim; }
(3)启动动画:start
(4)监听值变化事件:addUpdateListener
(5)实例:点击按钮开始动画,改变TextView的文字
btnStart.setOnClickListener(new OnClickListener() { @SuppressLint("NewApi") @Override public void onClick(View v) { ValueAnimator animator = ValueAnimator.ofFloat(0, 1f, 3f, 100f,1000f); animator.setDuration(300).addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { tvText.setText(animation.getAnimatedValue()+""); } }); animator.start(); } });
2、ObjectAnimator
(1)类集成关系图
可以看到ObjectAnimator也是继承自ValueAnimator.
(2)创建对象
创建ObjectAnimator对象的方法和ValueAnimator类似,但是增加了一个属性参数,拿ofFloat来说,源码:
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) { ObjectAnimator anim = new ObjectAnimator(target, propertyName); anim.setFloatValues(values); return anim; }
创建的时候也是调用了构造函数,构造函数中再去调用setPropertyName,将属性传入,以便后边对属性进行修改。
(3)实例:将按钮先左移后回到原先的位置
btnStart = (Button)findViewById(R.id.btn_start); btnTest = (Button)findViewById(R.id.testButton); btnStart.setOnClickListener(new OnClickListener() { @SuppressLint("NewApi") @Override public void onClick(View v) { float transX = btnTest.getTranslationX(); ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(btnTest, "translationX", transX, -1 * btnTest.getWidth(), transX); objectAnimator.setDuration(3000); objectAnimator.start(); } });
3、组合动画AnimatorSet实现多重效果
(1)继承关系
(2)实例:让按钮向右移动的同时向下移动
btnStart.setOnClickListener(new OnClickListener() { @SuppressLint("NewApi") @Override public void onClick(View v) { ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(btnTest, "translationX", btnTest.getTranslationX(), 500); ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(btnTest, "translationY", btnTest.getTranslationY(), 300); AnimatorSet animatorSet = new AnimatorSet(); //animatorSet.play() //.with() //.before() //.after(); animatorSet.play(objectAnimator1).with(objectAnimator2); animatorSet.setDuration(3000); animatorSet.start(); } });
4、改变运动方式可以使用setInterpolator,进行设置,
监听动画的状态,如开始,结束,取消等,使用addListener进行设置或者使用AnimatorListenerAdapter设置监听部分动作
animatorSet.addListener(new AnimatorListener() { @Override public void onAnimationStart(Animator animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animator animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animator animation) { // TODO Auto-generated method stub } @Override public void onAnimationCancel(Animator animation) { // TODO Auto-generated method stub } });
5、使用xml布局写属性动画
(1)创建animator文件夹
(2)设置动画的对象
(3)实例
<?xml version="1.0" encoding="utf-8"?> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:propertyName="translationX" android:valueFrom="0dp" android:valueTo="100dp"> </objectAnimator>
Animator animator = AnimatorInflater.loadAnimator(AnimatorSetActivity.this, R.animator.trans_btntest); animator.setTarget(btnTest); animator.start();
(4)xml布局实现组合动画,很简单,只需要将两个animator卸载set中,进行加载执行就好。
这里:属性中可以标注是顺序播放或者是同时播放的关系。
<animator> 对应代码中的ValueAnimator
<objectAnimator> 对应代码中的ObjectAnimator
<set> 对应代码中的AnimatorSet
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <objectAnimator android:duration="1000" android:propertyName="translationX" android:valueFrom="0dp" android:valueTo="100dp"> </objectAnimator> <objectAnimator android:duration="1000" android:propertyName="translationY" android:valueFrom="0dp" android:valueTo="100dp"> </objectAnimator> </set>
6、