1、简介
Animations是一个实现android UI界面动画效果的API,Animations提供了一系列的动画效果,可以进行旋转、缩放、淡入淡出等,这些效果可以应用在绝大多数的控件中。
Animations从总体上可以分为两大类:
- Tweened Animations(渐变动画):该类Animations提供了旋转、移动、伸展和淡出等效果。Alpha——淡入淡出,Scale——缩放效果,Rotate——旋转,Translate——移动效果。
- Frame-by-frame Animations(画面转换动画) :这一类Animations可以创建一个Drawable序列,这些Drawable可以按照指定的时间间歇一个一个的显示。
至于 LayoutAnimation(布局动画) 和 Property Animation(属性动画)就不在这里提啦。
2、TweenedAnimations
使用TweenedAnimations的步骤:
- 创建一个AnimationSet对象(Animation子类)
- 增加需要创建相应的Animation对象
- 更据项目的需求,为Animation对象设置相应的数据
- 将Animatin对象添加到AnimationSet对象当中
- 使用控件对象开始执行AnimationSet
可根据需求是否使用 AnimationSet,若只有一种动画,直接使用Animation对象去执行也可以。
在XML文件中定义动画:
- 在res目录中新建anim文件夹
- 在anim目录中新建一个my_anim.xml(注意文件名小写)
- 在 my_anim.xml 加入代码
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha />
<scale />
<translate />
<rotate />
</set>
这就是各种动画标签,当然,alpha这些同样可以做根节点。
Tweened Animations的分类:
动画使用的类 | Xml标签 | 动画的效果 |
---|---|---|
AlphaAnimation | <alpha/> | 渐变透明度动画效果 |
ScaleAnimation | <scale/> | 渐变尺寸缩放动画效果 |
RotateAnimation | <rotate/> | 画面旋转动画效果 |
TranslateAnimation | <translate/> | 画面位置移动动画效果 |
Tween Animations的通用方法:
1、setDuration(long durationMills) 设置动画持续时间(单位:毫秒)
2、setFillAfter(Boolean fillAfter) 如果fillAfter的值为true,则动画执行后,控件将停留在执行结束的状态
3、setFillBefore(Boolean fillBefore) 如果fillBefore的值为true,则动画执行后,控件将回到动画执行之前的状态
4、setInterpolator(Interpolator i) 动画插入器(加速、减速插入器),大家可以看我的博客Android动画–Interpolator的介绍 。
5、setStartOffSet(long startOffSet) 设置动画执行之前的等待时间
6、setRepeatCount(int repeatCount) 设置动画重复执行的次数
7、setRepeatMode(int repeatMode) 设置顺序重复或倒序重复
1、AlphaAnimation
控制对象alpha水平的动画。这个动画可以通过改变alpha属性,达到渐进渐出的效果。
1、构造方法:
AlphaAnimation(float fromAlpha, float toAlpha)
AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f); //从0.01f到1.0f渐变。0.0是完全透明,1.0完全不透明。
2、设置动画持续时间:
anim.setDuration(3000);
3、为控件绑定动画效果:
imageView.setAnimation(anim);
4、开始动画:
anim.start();
如果要从 xml 文件中将动画效果添加到View上也只需要一行代码:
imageView.startAnimation(AnimationUtils.loadAnimation(this, R.anim.my_anim));
如果需要重用这个动画,也可以将其抽离出来。以下代码将AlphaAnimation抽离后的代码可以如下:
AlphaAnimation animation = (AlphaAnimation) AnimationUtils.loadAnimation(this, R.anim.my_anim);
imageView.startAnimation(animation);
想要了解 xml alpha标签的各个属性,可以看我的博客Android–各种标签介绍,里面有对 alpha 介绍,这里就不提啦。
在代码中使用 Animation 可以很方便的调试、运行,但是代码的可重用性差,重复代码多。同样可以在xml文件中配置 Animation,这样做可维护性变高了,只不过不容易进行调试。
2、ScaleAnimation
该动画是为用作控制对象缩放比例,达到渐变尺寸缩放动画效果。
构造方法:
ScaleAnimation(float fromX, float toX, float fromY, float toY,);
//fromX,toX 分别是起始和结束时x坐标上的伸缩尺寸。
//fromY,toY 分别是起始和结束时y坐标上的伸缩尺寸。
ScaleAnimation(float fromX, float toX, float fromY, float toY,
float pivotX, float pivotY)
//pivotX,pivotY分别是伸缩动画相对于 x,y 坐标开始的位置。
ScaleAnimation(float fromX, float toX, float fromY, float toY,
int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
//pivotXType 动画在X轴相对于物件位置类型(可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT)
//pivotXValue 动画相对于物件的X坐标的开始位置
//pivotYType 动画在Y轴相对于物件位置类型
//pivotYValue 动画相对于物件的Y坐标的开始位置
ScaleAnimation animation =new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, 0.5f);
imageView.setAnimation(animation);
animation.setDuration(3000);
animation.start();
之所以会移动就是因为 pivotXtype 这样的属性啦,我们设置的是Animation.RELATIVE_TO_PARENT并且值为0.5f,就会以父控件的中心去进行缩放动画啦,而这个中心不是指这个页面的中心,而是从这个view以下剩余的空间的中心,它会从这个点移动到原来的位置。
如果设置成Animation.RELATIVE_TO_SELF:
ScaleAnimation animation1 = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.5f);
就会与使用pivotX,pivotY类似的效果。
3、RotateAnimation
该动画是为用作控制旋转,达到画面旋转动画效果。
构造方法:
RotateAnimation(float fromDegrees, float toDegrees)
//fromDegrees:旋转的开始角度。
//toDegrees:旋转的结束角度。
RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY)
//pivotX,pivotY:旋转的中心点相对于开始x,y坐标的位置
RotateAnimation (float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
//pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
//pivotXValue:X坐标的伸缩值。
//pivotYType:Y轴的伸缩模式
//pivotYValue:Y坐标的伸缩值。
RotateAnimation animation = new RotateAnimation(0f,360f, Animation.RELATIVE_TO_SELF,
0.5f,Animation.RELATIVE_TO_SELF,0.5f);
animation.setDuration(3000);
imageView.setAnimation(animation);
animation.start();
4、TranslateAnimation
该动画是为用作控制位置移动,达到画面位置移动动画效果。
构造方法:
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
//fromXDelta 动画开始的点离当前View X坐标上的差值
//toXDelta 动画结束的点离当前View X坐标上的差值
//fromYDelta 动画开始的点离当前View Y坐标上的差值
//toYDelta 动画开始的点离当前View Y坐标上的差值
TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue,
int fromYType, float fromYValue, int toYType, float toYValue)
//fromXType 动画开始时在X轴相对于物件位置类型(可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT)
//fromXValue 动画开始时相对于物件的X坐标的开始位置
//toXType 动画结束时在X轴相对于物件位置类型
//toXValue 动画结束时相对于物件的X坐标的开始位置
//fromYType 动画开始时在Y轴相对于物件位置类型
//fromYValue 动画开始时相对于物件的Y坐标的开始位置
//toYType 动画结束时在Y轴相对于物件位置类型
//toYValue 动画结束时相对于物件的Y坐标的开始位置
TranslateAnimation animation = new TranslateAnimation(0, 100, 0, 300);
animation.setDuration(1000);
animation.setRepeatCount(2);
animation.setRepeatMode(Animation.REVERSE);
imageView.setAnimation(animation);
animation.start();
5、动画监听
AnimationListener就是 Animation的监听接口。
final RotateAnimation animation1 = new RotateAnimation(0f,360f, 50.0f, 50.0f);
animation1.setDuration(3000);
final TranslateAnimation animation2 = (TranslateAnimation)
AnimationUtils.loadAnimation(this, R.anim.traslate);
imageView.startAnimation(animation1);
animation1.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
imageView.startAnimation(animation2);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
AnimationListener 会让我们重写三个方法,分别是开始的时候调用,完成的时候调用,重复的时候调用。
translate 是我写得一个 anim Xml,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromXDelta="-100%"
android:fromYDelta="0"
android:toXDelta="100%p"
android:toYDelta="0" />
6、AnimationSet
上面四种动画就是 Tweened Animations 的主要动画,但在开发的时候,我们并不是只单独的使用它们中的某一种,我们也会把它们组合起来使用,这时候有两种方法,第一种就是上面所用的 AnimationListener,在一个动画结束后去开始另一个,不过这种方式不能将几种动画的效果叠加在一起。第二种就是使用动画集 AnimationSet 啦。
构造方法:
AnimationSet(boolean shareInterpolator)
//true表示使用Animation的interpolator,false则是使用自己的,默认为LinearInterpolator。
要想实现和 AnimationListener 一样的效果,只要为第二个动画设置startOffset,值为前一个动画播放的时间即可。
AnimationSet as = new AnimationSet(true);
RotateAnimation animation1 = new RotateAnimation(0f,360f, 50.0f, 50.0f);
animation1.setDuration(3000);
ranslateAnimation animation2 = (TranslateAnimation)
AnimationUtils.loadAnimation(this, R.anim.traslate);
animation2.setStartOffset(3000);
as.addAnimation(animation1);
as.addAnimation(animation2);
imageView.startAnimation(as);
但因为是动画开始播放的间隔,所以开始前设置的如起始点的位置是会被后面的动画所覆盖的。
AnimationSet as = new AnimationSet(true);
RotateAnimation animation1 = new RotateAnimation(0f,360f, 50.0f, 50.0f);
animation1.setRepeatCount(1);
animation1.setDuration(3000);
ScaleAnimation animation2 = new ScaleAnimation(1,3,1,3);
animation2.setDuration(3000);
ScaleAnimation animation3 = new ScaleAnimation(1f,1/3f,1f,1/3f);
animation3.setDuration(3000);
animation3.setStartOffset(3000);
as.addAnimation(animation1);
as.addAnimation(animation2);
as.addAnimation(animation3);
imageView.startAnimation(as);
7、Activity切换动画
Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画。
它包括两个部分:
- Activity退出时的动画;
- Activity进入时的动画;
overridePendingTransition 就是提供给我们实现这个动画的函数。
overridePendingTransition(int enterAnim, int exitAnim)
//enterAnim 定义Activity进入屏幕时的动画
//exitAnim 定义Activity退出屏幕时的动画
关于overridePendingTransition这个函数,它必须紧挨着startActivity()或者finish()函数之后调用。
这里写一个例子,先写好进入和退出的两个动画:
<!-- res/anim/zoom_in.xml-->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator" >
<scale
android:duration="1000"
android:fromXScale="0.1"
android:fromYScale="0.1"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.0"
android:toYScale="1.0" />
<alpha
android:duration="1000"
android:fromAlpha="0"
android:toAlpha="1.0" />
</set>
<!-- res/anim/zoom_out.xml-->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator"
android:zAdjustment="top">
<scale
android:duration="500"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%p"
android:pivotY="50%p"
android:toXScale="0.1"
android:toYScale="0.1" />
<alpha
android:duration="500"
android:fromAlpha="1.0"
android:toAlpha="0" />
</set>
这两个都是很简单的组合动画,就是Activity在退出的时候会整个缩小并变透明,在进入的时候会放大并变得不透明。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MainActivity2.class);
startActivity(intent);
overridePendingTransition(R.anim.zoom_in, R.anim.zoom_out);
}
});
}
}
而第二个Activity只有一张图片充当背景。
3、FrameAnimations
Frame动画,即事先播放先做好的图像,跟放胶片电影类似,开发步骤:
(1)把准备好的图片放进项目res/ drawable下。
(2)在项目的res目录下创建文件夹anim,然后在anim文件夹下面定义动画XML文件,文件名称可以自定义。当然也可以采用编码方式定义动画效果(使用AnimationDrawable类)。
(3)为View控件绑定动画效果。调用代表动画的AnimationDrawable的start()方法开始动画。
这里也只是介绍下步骤,因为在我的博客Android–Drawable标签介绍和Android–各种Drawable介绍已经有很详细的介绍啦,有兴趣的可以去看。
结束语:本文仅用来学习记录,参考查阅。