public class AnimatorDemo {//属性动画,通过调用Get Set方法来真实的控制了一个View的属性值//如果该属性没有get set方法,则可以通过包装类来解决 ->mTargetView.getLayoutParams().width=width;//也可以通过ValueAnimtor的来解决这个问题private static AnimatorDemo instance;public static AnimatorDemo getInstance(){ if (instance==null){ synchronized (AnimatorDemo.class){ if (instance==null) instance=new AnimatorDemo(); } } return instance;}//ObjectAnimator继承于ValueAnimator//更像是一个数值发生器,用来产生有规律的数字public void doValueAnimator(final ImageView iv){ ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 100, 0, 300); valueAnimator.setDuration(5000); valueAnimator.setTarget(iv); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { Float animatedValue = (Float) animation.getAnimatedValue(); iv.setTranslationX(animatedValue); } }); valueAnimator.start();}public void doAlpha(ImageView iv){}public void doRotate(ImageView iv){}public void doTranslate(ImageView iv){ ObjectAnimator translationX = ObjectAnimator.ofFloat(iv, "translationX", 0, 300); translationX.setDuration(5000); translationX.start();}public void doScale(ImageView iv){ ObjectAnimator translationX = ObjectAnimator.ofFloat(iv, "scaleX", 0, 3); translationX.setDuration(5000); translationX.start();}//属性动画集合public void doGroup(ImageView iv){ //实现方法一:使用PropertyValuesHolder/* PropertyValuesHolder translationX =PropertyValuesHolder.ofFloat("translationX", 0, 300); PropertyValuesHolder scaleX =PropertyValuesHolder.ofFloat("scaleX", 0, 3); ObjectAnimator.ofPropertyValuesHolder(iv,translationX,scaleX).setDuration(5000).start();*/ //实现方法二:使用AnimatorSet ObjectAnimator translationX2 = ObjectAnimator.ofFloat(iv, "translationX", 0, 300); ObjectAnimator scaleX2 = ObjectAnimator.ofFloat(iv, "scaleX", 0, 3); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.setDuration(5000); animatorSet.playTogether(translationX2,scaleX2); animatorSet.start();}}