动画分类:
- 传统动画(帧动画(Frame Animation)/ 补间动画(Tweened Animation))。
- 属性动画(Attribute Animation)
- 帧动画
帧动画是将图片一张一张的连续播放,适当的速度,让人感觉是连续的动画。
xml文件
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<!--oneshot为true则动画只执行一遍, 为false则重复执行-->
<item android:drawable="@color/md_red_50"
android:duration="200"/>
<item android:drawable="@color/md_red_100"
android:duration="200"/>
<item android:drawable="@color/md_red_200"
android:duration="200"/>
<item android:drawable="@color/md_red_300"
android:duration="200"/>
<item android:drawable="@color/md_red_400"
android:duration="200"/>
<item android:drawable="@color/md_red_500"
android:duration="200"/>
<item android:drawable="@color/md_red_600"
android:duration="200"/>
<item android:drawable="@color/md_red_700"
android:duration="200"/>
<item android:drawable="@color/md_red_800"
android:duration="200"/>
<item android:drawable="@color/md_red_900"
android:duration="200"/>
</animation-list>
Activity内容
private ImageView mIvFrame;
mIvFrame = (ImageView) this.findViewById(R.id.iv_frame);
mIvFrame.setImageResource(R.drawable.frame_list);
AnimationDrawable animationDrawable = (AnimationDrawable) mIvFrame.getDrawable();
animationDrawable.start();
- 补间动画
- Alpha(淡入淡出)
- Translate(位移)
- Scale(缩放大小)
- Rotate(旋转)
(1) Alpha(淡入淡出)
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="2000"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
/**补间动画*/
private ImageView mIvTweened;
mIvTweened = (ImageView) this.findViewById(R.id.iv_tween);
// 淡入淡出
//Animation animation = AnimationUtils.loadAnimation(this, R.anim.alpha);
mIvTweened.startAnimation(animation);
(2) Translate(位移)
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0.0"
android:toXDelta="100.0"
android:toYDelta="100.0"
android:fromYDelta="0.0"
android:duration="2000"
android:interpolator="@android:anim/accelerate_interpolator"
/>
/**补间动画*/
private ImageView mIvTweened;
mIvTweened = (ImageView) this.findViewById(R.id.iv_tween);
// 淡入淡出
//Animation animation = AnimationUtils.loadAnimation(this, R.anim.translate);
mIvTweened.startAnimation(animation);
(3) Scale(缩放大小)
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="0.0"
android:toXScale="1.0"
android:fromYScale="0.0"
android:toYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"
/>
/**补间动画*/
private ImageView mIvTweened;
mIvTweened = (ImageView) this.findViewById(R.id.iv_tween);
// 淡入淡出
//Animation animation = AnimationUtils.loadAnimation(this, R.anim.scale);
mIvTweened.startAnimation(animation);
(4) Rotate(旋转)
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:pivotX="50%"
android:pivotY="50%"
android:drawable="@color/md_green_A700"
android:fromDegrees="0.0"
android:toDegrees="45"
android:duration="2000"
/>
/**补间动画*/
private ImageView mIvTweened;
mIvTweened = (ImageView) this.findViewById(R.id.iv_tween);
// 淡入淡出
//Animation animation = AnimationUtils.loadAnimation(this, R.anim.scale);
mIvTweened.startAnimation(animation);
(5) 组合动画
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="2000"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
<rotate
android:pivotX="50%"
android:pivotY="50%"
android:drawable="@color/md_green_A700"
android:fromDegrees="0.0"
android:toDegrees="45"
android:duration="2000"
/>
<scale
android:fromXScale="0.0"
android:toXScale="1.0"
android:fromYScale="0.0"
android:toYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"
/>
<translate
android:fromXDelta="0.0"
android:toXDelta="100.0"
android:toYDelta="100.0"
android:fromYDelta="0.0"
android:duration="2000"
android:interpolator="@android:anim/accelerate_interpolator"
/>
</set>
/**补间动画*/
private ImageView mIvTweened;
mIvTweened = (ImageView) this.findViewById(R.id.iv_tween);
// 淡入淡出
//Animation animation = AnimationUtils.loadAnimation(this, R.anim.set);
mIvTweened.startAnimation(animation);
(6) 属性解释
- android:interpolator主要作用是可以控制动画的变化速率。Android 系统已经为我们提供了一些Interpolator ,比如 accelerate_decelerate_interpolator,accelerate_interpolator等。
- pivot决定了当前动画执行的参考位置。pivot 这个属性主要是在translate 和 scale 动画中,这两种动画都牵扯到view 的“物理位置“发生变化,所以需要一个参考点。而pivotX和pivotY就共同决定了这个点;它的值可以是float或者是百分比数值。
pivotX取值 | 含义 |
---|---|
10 | 距离动画所在view自身左边缘10像素 |
10% | 距离动画所在view自身左边缘 的距离是整个view宽度的10% |
10%p | 距离动画所在view父控件左边缘的距离是整个view宽度的10% |
- 属性动画(Attribute Animation)
属性动画,顾名思义它是对于对象属性的动画。因此,所有补间动画的内容,都可以通过属性动画实现。
属性动画使用方法:
/**
* 属性动画
*/
private void attrAnimation() {
// 淡入淡出
//ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mIvAttr, "alpha", 0.0f, 0.5f, 0.8f, 1.0f);
//objectAnimator.setDuration(2000);
//objectAnimator.start();
// 位移
/*ObjectAnimator objectAnimatorX = ObjectAnimator.ofFloat(mIvAttr, "translationX", 100, 300);
ObjectAnimator objectAnimatorY = ObjectAnimator.ofFloat(mIvAttr, "translationY", 100, 300);
AnimatorSet animatorSet = new AnimatorSet();
// 同时播放
//animatorSet.playTogether(objectAnimatorX, objectAnimatorY);
// 有序播放
animatorSet.playSequentially(objectAnimatorX, objectAnimatorY);
animatorSet.setDuration(5000);
animatorSet.start();*/
// 缩放
//ObjectAnimator objectAnimatorX = ObjectAnimator.ofFloat(mIvAttr, "scaleX", 0.0f, 1.0f);
//ObjectAnimator objectAnimatorY = ObjectAnimator.ofFloat(mIvAttr, "scaleY", 0.0f, 2.0f);
//AnimatorSet animatorSet = new AnimatorSet();
//animatorSet.playTogether(objectAnimatorX, objectAnimatorY);
//animatorSet.setDuration(5000);
//animatorSet.start();
// 旋转
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mIvAttr, "rotation", 0, 360);
objectAnimator.setDuration(2000);
objectAnimator.start();
}