View动画的作用对象是View,它支持4种动画效果,分别是平移动画(子类:TranslateAnimation,标签:<translate>)、缩放动画(子类:ScaleAnimation,标签:<scale>)、旋转动画(子类:RotateAnimation,标签:<rotate>)和透明度动画(子类:AlphaAnimation,标签:<alpha>)。
本小节学习平移动画。
一、概念
平移动画,子类:TranslateAnimation,标签:<translate>
它可以使一个View在水平和竖直方向完成平移的动画效果。
二、实现
1. XML实现
<translate>标签常用属性如下:
android:fromXDelta:x方向上相对于父容器的起始值,比如0;
android:toXDelta:x方向上相对于父容器的结束值,比如100;
android:fromYDelta:y方向上相对于父容器的起始值;
android:toYDelta:y方向上相对于父容器的结束值。
//res/anim/translate_animation.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="300"
android:toYDelta="300"
android:duration="3000"
android:repeatCount="2"
/>
//布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="500px"
android:layout_height="500px"
android:layout_marginLeft="100px"
android:background="@color/colorAccent">
<TextView
android:id="@+id/animate_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorPrimary"
android:text="Hello Android!" />
</RelativeLayout>
//代码,MainActivity
private void translateAnimationXML() {
Animation translateAnimation = AnimationUtils.loadAnimation(this, R.anim.translate_animation);
mAnimate_tv.setAnimation(translateAnimation);
mAnimate_tv.startAnimation(translateAnimation);
}
private void stopAnimation() {
mAnimate_tv.clearAnimation();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
translateAnimationXML();
}
@Override
protected void onDestroy() {
super.onDestroy();
stopAnimation();
}
2. 代码实现
构造方法:
public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
参数说明:
fromXDelta:x方向上相对于父容器的起始值,比如0;
toXDelta:x方向上相对于父容器的结束值,比如100;
fromYDelta:y方向上相对于父容器的起始值;
toYDelta:y方向上相对于父容器的结束值。
//布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="500px"
android:layout_height="500px"
android:layout_marginLeft="100px"
android:background="@color/colorAccent">
<TextView
android:id="@+id/animate_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorPrimary"
android:text="Hello Android!" />
</RelativeLayout>
//代码,MainActivity
private void translateAnimationCode() {
mTranslateAnimation = new TranslateAnimation(0, 300, 0, 300);
mTranslateAnimation.setDuration(3000);
mTranslateAnimation.setRepeatCount(2);
mTranslateAnimation.setFillAfter(true);
mAnimate_tv.setAnimation(mTranslateAnimation);
mAnimate_tv.startAnimation(mTranslateAnimation);
}
private void stopAnimation() {
mAnimate_tv.clearAnimation();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
translateAnimationCode();
}
@Override
protected void onDestroy() {
super.onDestroy();
stopAnimation();
}
三、动画过程监听
通过Animation的setAnimationListener方法可以给View动画添加过程监听。
接口如下:
public static interface AnimationListener {
void onAnimationStart(Animation animation);
void onAnimationEnd(Animation animation);
void onAnimationRepeat(Animation animation);
}
代码如下:
private void translateAnimationXML() {
Animation translateAnimation = AnimationUtils.loadAnimation(this, R.anim.translate_animation);
translateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
Log.d("MainActivity", "zwm, onAnimationStart");
}
@Override
public void onAnimationEnd(Animation animation) {
Log.d("MainActivity", "zwm, onAnimationEnd");
}
@Override
public void onAnimationRepeat(Animation animation) {
Log.d("MainActivity", "zwm, onAnimationRepeat");
}
});
mAnimate_tv.setAnimation(translateAnimation);
mAnimate_tv.startAnimation(translateAnimation);
}