现在要做个简单的动画效果:
错误的实现方法:
1,属性动画非常的方便,也能实现非常好的动画效果,非常强大。但以下使用方式是非常错误的:
/**
* 教师端课前,课中,查看作业,三个小书动画
* @param v
*/
public static void setAnim(View v){
ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(v, "scaleX", 1f, 1.25f, 1f, 1.25f, 1f);
ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(v, "scaleY", 1f, 1.25f, 1f, 1.25f, 1f);
ObjectAnimator rotation = ObjectAnimator.ofFloat(v, "rotation", 0f, -15f, 15f, 0f);
final AnimatorSet set = new AnimatorSet();
set.play(scaleXAnimator).with(scaleYAnimator).before(rotation);
set.setDuration(2000);
set.start();
set.addListener(new Animator.AnimatorListener(){
@Override
public void onAnimationStart (Animator animator) {
}
@Override
public void onAnimationEnd (Animator animator)
{
set.start(); //行24
}
@Override
public void onAnimationCancel (Animator animator){
}@Override
public void onAnimationRepeat (Animator animator){
}});
}
使用错误原因:
如果在主线程中这样使用,24行这样的做法相当于一个死循环,很快主线程就oom了
正确用法:
官方推荐用法:
PropertyValuesHolder holdeX = PropertyValuesHolder.ofFloat("scaleX", 1f, 1.25f, 1f);
PropertyValuesHolder holderY = PropertyValuesHolder.ofFloat("scaleY", 1f, 1.25f, 1f);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(v, holdeX, holderY);
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.setRepeatMode(ValueAnimator.RESTART);
animator.setDuration(1000);
animator.start();
使用属性的方式设置重复动画效果则不会出现oom(虽然还未证实,但很可能系统api重复动画应该用的子线程,后续继续了解)