网上没找到,于是自己写了一个,简单的算法,利用 PropertyValuesHolder实现多个动画的集合,不多说,直接上代码吧,非常好理解:
/**
* 气泡漂浮动画
* @param view
* @param duration 动画运行时间
* @param offset 动画运行幅度
* @param repeatCount 动画运行次数
* @return
*/
public static ObjectAnimator bubbleFloat(View view, int duration, int offset, int repeatCount) {
float path = (float) (Math.sqrt(3)/2*offset);
PropertyValuesHolder translateX = PropertyValuesHolder.ofKeyframe(View.TRANSLATION_X,
Keyframe.ofFloat(0f, 0),
Keyframe.ofFloat(1/12f, offset / 2),
Keyframe.ofFloat(2/12f, path),
Keyframe.ofFloat(3/12f, offset),
Keyframe.ofFloat(4/12f, path),
Keyframe.ofFloat(5/12f, offset / 2),
Keyframe.ofFloat(6/12f, 0),
Keyframe.ofFloat(7/12f, -offset / 2),
Keyframe.ofFloat(8/12f, -path),
Keyframe.ofFloat(9/12f, -offset),
Keyframe.ofFloat(10/12f, -path),
Keyframe.ofFloat(11/12f, -offset/2),
Keyframe.ofFloat(1f, 0)
);
PropertyValuesHolder translateY = PropertyValuesHolder.ofKeyframe(View.TRANSLATION_Y,
Keyframe.ofFloat(0f, 0),
Keyframe.ofFloat(1/12f, offset-path),
Keyframe.ofFloat(2/12f, offset/2),
Keyframe.ofFloat(3/12f, offset),
Keyframe.ofFloat(4/12f, offset*3/2),
Keyframe.ofFloat(5/12f, offset+path),
Keyframe.ofFloat(6/12f, offset*2),
Keyframe.ofFloat(7/12f, offset+path),
Keyframe.ofFloat(8/12f, offset*3/2),
Keyframe.ofFloat(9/12f, offset),
Keyframe.ofFloat(10/12f, offset/2),
Keyframe.ofFloat(11/12f, offset-path),
Keyframe.ofFloat(1f, 0)
);
PropertyValuesHolder rotateX = PropertyValuesHolder.ofKeyframe(View.ROTATION_X,
Keyframe.ofFloat(0f, 0),
Keyframe.ofFloat(1/12f, offset / 2),
Keyframe.ofFloat(2/12f, path),
Keyframe.ofFloat(3/12f, offset),
Keyframe.ofFloat(4/12f, path),
Keyframe.ofFloat(5/12f, offset / 2),
Keyframe.ofFloat(6/12f, 0),
Keyframe.ofFloat(7/12f, -offset / 2),
Keyframe.ofFloat(8/12f, -path),
Keyframe.ofFloat(9/12f, -offset),
Keyframe.ofFloat(10/12f, -path),
Keyframe.ofFloat(11/12f, -offset/2),
Keyframe.ofFloat(1f, 0)
);
PropertyValuesHolder rotateY = PropertyValuesHolder.ofKeyframe(View.ROTATION_Y,
Keyframe.ofFloat(0f, 0),
Keyframe.ofFloat(1/12f, offset / 2),
Keyframe.ofFloat(2/12f, path),
Keyframe.ofFloat(3/12f, offset),
Keyframe.ofFloat(4/12f, path),
Keyframe.ofFloat(5/12f, offset / 2),
Keyframe.ofFloat(6/12f, 0),
Keyframe.ofFloat(7/12f, -offset / 2),
Keyframe.ofFloat(8/12f, -path),
Keyframe.ofFloat(9/12f, -offset),
Keyframe.ofFloat(10/12f, -path),
Keyframe.ofFloat(11/12f, -offset/2),
Keyframe.ofFloat(1f, 0)
);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(view, translateX, translateY, rotateX, rotateY).
setDuration(duration);
animator.setRepeatCount(repeatCount);
animator.setInterpolator(new LinearInterpolator());
return animator;
}
使用方法:
bubbleFloat(view, 3000, 10, -1);
Have a nice day!