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="/apk/res/android"android:duration="1000"><translateandroid: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() {@Overridepublic void onAnimationStart(Animation animation) {}@Overridepublic void onAnimationEnd(Animation animation) {mTranslate_img.clearAnimation();}@Overridepublic void onAnimationRepeat(Animation animation) {}});}