Android JDK为我们提供了4种动画效果,分别是: AlphaAnimation,RotateAnimation, ScaleAnimation, TranslateAnimation.今天我想讲解的是TranslateAnimation这个动画效果。

TranslateAnimation是移动的动画效果。它有三个构造函数,分别是:

1.public TranslateAnimation(Context context,AttributeSet attrs) 略过

2.public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)

这是最常用的一个构造方法,其具体的参数解释如下:

float fromXDelta:这个参数表示动画开始的点离当前View X坐标上的差值;

大家一定要注意这是 差值 不是具体坐标,要是为正那么就是 在屏幕右侧多些

float toXDelta, 这个参数表示动画结束的点离当前View X坐标上的差值;

float fromYDelta, 这个参数表示动画开始的点离当前View Y坐标上的差值;

float toYDelta)这个参数表示动画开始的点离当前View Y坐标上的差值;

如果view在A(x,y)点 那么动画就是从B点(x+fromXDelta, y+fromYDelta)点移动到C 点(x+toXDelta,y+toYDelta)点.

3.public TranslateAnimation (int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)

其具体的参数解释如下:
fromXType:第一个参数是x轴方向的值的参照(Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF,or Animation.RELATIVE_TO_PARENT);

fromXValue:第二个参数是第一个参数类型的起始值;

toXType,toXValue:第三个参数与第四个参数是x轴方向的终点参照与对应值;

后面四个参数就不用解释了。如果全部选择Animation.ABSOLUTE,其实就是第二个构造函数。

以x轴为例介绍参照与对应值的关系:

如果选择参照为Animation.ABSOLUTE,那么对应的值应该是具体的坐标值,比如100到400,指绝对的屏幕像素单位

如果选择参照为Animation.RELATIVE_TO_SELF或者 Animation.RELATIVE_TO_PARENT指的是相对于自身或父控件,对应值应该理解为相对于自身或者父控件的几倍或百分之多少。

接下来具体介绍在Android如何使用TranslateAnimation 动画实现上下平移横线,实现了类似动态扫描框里面的感觉,其主要的设定过程如下。

首先在需要显示的xml文件中,根据自己的需求定义控件。

在定义.java文件中定义获取控件,mTranslate_img 是需要进行平移的控件

mTranslate_img = (ImageView) findViewById(R.id.translate_img);
接下来定义动画
 mTranslateAnimation = AnimationUtils.loadAnimation(mContext, R.anim.translate_anim);


这里需要得到调用的activity的context,如果直接是在一个activity中实现,则直接this代替mContext就可以。
这句话是定义动画的效果,其中调用了R.anim.translate_anim,因此在没有在translate_anim.xml文件的情况下,需要自己去创建translate_anim.xml文件,在文件中写入如下代码,是对动画的基本运行性质的定义,在这个xml里面基本上可以定义完整的动画效果,包括动画的始末位置(二维坐标形式),运行一个动画周期所需的时间,运行多少次后停止,等等。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000">

    <translate
        android:fromYDelta="0%p"
        android:toYDelta="100%p"/>
</set>

接下来定义运行的方式,一共有很多种方式,本次调用的是先加速后减速的方式,也可以匀速,先减速后加速等等,不同的方式有不同的代码:

Interpolator interpolator = new AccelerateDecelerateInterpolator();//先加速后减速

然后将这个运动方式加载到动画中。

mTranslateAnimation.setInterpolator(interpolator);

这些步骤基本上都是在activity的onCreate()或者是非activity的.java初始化的时候中定义。到这里就已经定义好动画的基本效果了,当然,同样的,由于为了让动画在不同的机型上运行,不同的机型会有不同的显示屏大小,如果全部在xml中写死,那肯定不是理想的做法,所以,为了提高动画的可兼容性,这些动画的属性,又可以在代码中调用动画之前重新更改。

获取动画加载的高度,用于设定动画的始末位置。

float toYDelta = mAdjustSizeView.getHeight()/2;

可以根据高度设定运行一周所花的时间,这样在不同的机型上,动画运动的速度也就相近了,其中*14是由于自身设定的需求,可以自行根据不同需求调整。

int duration = (int)toYDelta * 14;

根据控件高度设定动画始末位置,值得注意的是动画是根据控件的二维坐标进行设定的,其具体的形式有不同的三种,可以回头看文章开始介绍的知识点。

TranslateAnimation translateAnimation = new TranslateAnimation(0,0,-toYDelta,toYDelta);
translateAnimation.setDuration(duration);//跑一个周期所用时长
 translateAnimation.setRepeatCount(-1);//无限循环
 translateAnimation.setInterpolator(new DecelerateInterpolator());
 mTranslate_img.startAnimation(translateAnimation);

将这些代码封装成一个函数,这样在需要启动动画的地方调用函数就能让动画动起来。
/设置上下平移动画参数并启动

private void startTranslate(){
	
		float toYDelta = mView.getHeight()/2;
		
		int duration = (int)toYDelta * 14;
		
		TranslateAnimation translateAnimation = new TranslateAnimation(0,0,-toYDelta,toYDelta);//根据控件高度设定动画始末位置
		
		translateAnimation.setDuration(duration);//跑一个周期所用时长
		
		translateAnimation.setRepeatCount(-1);//无限循环
		
		translateAnimation.setInterpolator(new DecelerateInterpolator());
		
		mTranslate_img.startAnimation(translateAnimation);
		
		translateAnimation.setAnimationListener(new Animation.AnimationListener() {
			
			@Override
			public void onAnimationStart(Animation animation) {
			}

			@Override
			public void onAnimationEnd(Animation animation) {
				mTranslate_img.clearAnimation();
			}

			@Override
			public void onAnimationRepeat(Animation animation) {
			}
		});
}