属性动画和传统动画的区别
传统动画只是具有显示的效果,不会正真改变位置、属性动画则相反
传统动画的写法
TranslateAnimation translateAnimation = new TranslateAnimation(0,200,0,0);
translateAnimation.setFillAfter(true);
translateAnimation.setDuration(1000);
iv.startAnimation(translateAnimation);
属性动画的几种写法
1:
//3个动画是同时执行的
ObjectAnimator.ofFloat(iv,"rotation",0f,360f).setDuration(1000).start();
ObjectAnimator.ofFloat(iv,"translationX",0f,150f).setDuration(1000).start();
ObjectAnimator.ofFloat(iv,"translationY",0f,150f).setDuration(1000).start();
2:
PropertyValuesHolder p1 = PropertyValuesHolder.ofFloat("rotation",0f,360f);
PropertyValuesHolder p2 = PropertyValuesHolder.ofFloat("translationX",0f,150f);
PropertyValuesHolder p3 = PropertyValuesHolder.ofFloat("translationY",0f,150f);
ObjectAnimator.ofPropertyValuesHolder(iv,p1,p2,p3).setDuration(1000).start();
3:使用set指定动画顺序动画
ObjectAnimator an1 = ObjectAnimator.ofFloat(iv, "rotation", 0f, 360f);
ObjectAnimator an2 = ObjectAnimator.ofFloat(iv, "translationX", 0f, 150f);
ObjectAnimator an3 = ObjectAnimator.ofFloat(iv, "translationY", 0f, 150f);
AnimatorSet set = new AnimatorSet();
// set.playTogether(an1,an2,an3); //一起执行
//set.playSequentially(an1,an2,an3);//分别执行
set.play(an1).with(an2);
set.play(an3).after(an2);
set.setDuration(1000);
set.start();
4:使用Valueanimator实现倒计时
ObjectAnimator是Valueanimator的子类
ValueAnimator animator = ValueAnimator.ofInt(1,100);
animator.setDuration(5000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Integer value = (Integer) animation.getAnimatedValue();
btu.setText(value+"");
}
});
animator.start();
5:使用animator实现菜单弹出
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private int[] ids = {R.id.iv_a, R.id.iv_b, R.id.iv_c, R.id.iv_d};
private List<ImageView> imageViewList = new ArrayList<>();
private boolean flag = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i = 0; i < ids.length; i++) {
ImageView iv = (ImageView) findViewById(ids[i]);
iv.setOnClickListener(this);
imageViewList.add(iv);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.iv_a:
if (flag)
startanimator();
else
overanimator();
break;
}
}
private void overanimator() {
for (int i = 1; i < ids.length; i++) {
ObjectAnimator animator = ObjectAnimator.ofFloat(imageViewList.get(i), "translationY", i * 300f,0f);
animator.setDuration(500);
//延迟动画时间
animator.setStartDelay(i * 300);
//加载动画
animator.setInterpolator(new BounceInterpolator());
animator.start();
flag = true;
}
}
private void startanimator() {
for (int i = 1; i < ids.length; i++) {
ObjectAnimator animator = ObjectAnimator.ofFloat(imageViewList.get(i), "translationY", 0f, i * 300f);
animator.setDuration(500);
//延迟动画时间
/* new AnticipateInterpolator() 先缓慢往指定方向的反方向移,再加速往指定方向移
* new AnticipateOvershootInterpolator() 先缓慢往指定方向的反方向移,再加速往指定方向移,再缓慢往指 定方向的反方向移
* new DecelerateInterpolator() 由快变慢
* new FastOutLinearInInterpolator() 快速匀速运动
* new FastOutSlowInInterpolator() 先慢后快再慢
* new LinearInterpolator() 缓慢匀速移动
* new LinearOutSlowInInterpolator() 先极快后慢
* new OvershootInterpolator() 快速运动超出指定距离后缓慢返回
*/
animator.setStartDelay(i * 300);
//加载动画
animator.setInterpolator(new BounceInterpolator());
animator.start();
flag=false;
}
}
}