安卓有三种基本的动画:
1.帧动画
2.补间动画
3.属性动画(安卓3.0以后加入)
帧动画
帧动画是在drawable下新建一个xml文件,然后标签为animation-list,标签下是一个个item,然后将这个drawable设置为需要动画的view的background,最后在代码中找到这个动画,然后运行就好。
img.setImageResource(R.drawable.xx);
AnimationDrawable animationDrawable = (AnimationDrawable) img.getDrawable();
animationDrawable.start();
补间动画
补间动画就是所谓的移动、旋转、缩放之类的操作。补间动画并不会改变view的真正位置,例如将一个button从位置A移动到位置B,假如button有点击事件,这时点击位置B并不会有反应,只有点击位置A才有触发点击时间。
补间动画有两种实现方式:
1.在res-anim 里新建xml文件,其中的标签对应将要进行的动画如:
<?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="100"
android:toYDelta="100"
android:duration="2000"
>
</translate>
需要注意的是,我这里的duration属性,studio没有提示,需要自己手动输入。然后在代码中实现动画
Animation animation = AnimationUtils.loadAnimation(this, R.anim.xx);
view.startAnimation(animation);
2.当然,也可以不写xml文件,直接通过代码实现
TranslateAnimation translateAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0f,
Animation.ABSOLUTE, targetX,
Animation.RELATIVE_TO_SELF, 0f,
Animation.ABSOLUTE, targetY);
translateAnimation.setDuration(2000);
view.startAnimation(animation);
属性动画
属性动画有两个核心类ObjectAnimator以及ValueAnimator
其中ValueAnimator需要我们自己去实现元素的更新
ValueAnimator animator = ValueAnimator.ofInt(0, 100);
animator.setTarget(view);
animator.setDuration(1000).start();
animator.addUpdateListener(new AnimatorUpdateListener(){
@Override
public void onAnimationUpdate(ValueAnimator animation){
view.setTranslationY((Float) animation.getAnimatedValue());
}
});
而ObjectAnimator就简单多了
ObjectAnimator
.ofInt(view, "translateY", 0, 100)//
.setDuration(1000)//
.start();
当然属性动画也可以在res-animator建立xml文件来实现动画。
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:valueFrom="0"
android:valueTo="100"
android:propertyName="translateY"
android:duration="1000"
>
</objectAnimator>
然后在代码中通过代码实现动画效果
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.xx);
animator.setTarget(view); //view表示我们要设置动画的对象
animator.start();