关于TranslateAnimation几个构造函数的理解

来源:互联网 发布:葛优躺 知乎 编辑:程序博客网 时间:2024/06/04 23:34
在android动画中,最常用的一个莫不是TranslateAnimation了,这个类主要负责实现控件的动态位移,经常被用做指示器的移动动画。比如qq安卓客户端的指示器,如下图。 
 
       关于TranslateAnimation几个构造函数的参数意义,曾困惑我不少时间,参考官方文档和网上的讲解,通过试验总结出一些自己的理解,如果有误敬请指正。
       TranslateAnimation共有三个构造函数,分别是:

其中,我们最常用的是后两个,现在主要想说明一下我对后两个函数参数的理解。
        先说第二个构造函数:TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, floattoYDelta)。
        Delta,顾名思义表示的是一个后一个和前一个的差值。XDelta即表示在X方向上的差值,同理YDelta表示在Y方向的差值。若XDelta>0,则说明控件向右侧发生移动,否则向左侧移动,Y轴方向是相同的道理。现在来说下各个参数的意思:
        fromXDelta:控件的开始移动前的位置,为什么是Delta呢?因为在此之前,该控件可能已经发生过了位移,因此它已经偏离了控件最初始的位置。因此采用了距离最初始位置的偏移量。
        toXDelta:相同道理,想要移动的终点位置距离最初始位置的偏移量。记住,一定不要混淆的是,不要把这个最初始位置当成是移动开始前控件的位置,否则将会发生错误移动。
        后面两个参数表示Y方向上的,和X方向上的同理。需要说明的是,这个是绝对偏移量,是以像素为单位进行计算的。
        再来说说第三个构造函数。
        当X方向或者Y方向上的Type选择为Animation.ABSOLUTE时候,表示为绝对像素,此时XValue和YValue参数的含义和第二个构造函数相同。

        而当X方向或者Y方向上的Type选择为Animation.RELATIVE_TO_SELF或者 Animation.RELATIVE_TO_PARENT时候,则表示相位移量了,举个例子来说,如果在X方向上选择Animation.RELATIVE_TO_SELF,那么当XValue=1.0f时,则偏移量为一个自身宽度。如果在X方向上选择Animation.RELATIVE_TO_PARENT时,则偏移量为一个父控件宽度。Y方向是相同的道理,只是把宽度换成了高度而已。


Animations

Animations,顾名思义,就是动画效果。

Animations提供了一系列的动画效果,这些效果可以应用在绝大多数的控件。



Animations的分类:
Animations从总体来说可以分为两大类:
第一类:Tweened Animations。渐变动画。该类Animations提供了旋转,移动,伸展和淡出等等效果。

第二类:Frame-by-Frame Animations。这一类Animations可以创建一个Drawable序列,这些Drawable可以按照指定的时间间歇一个一个的显示。


Tweened Animations的分类:
1.Alpha:淡入淡出效果

2.Scale:缩放效果

3.Rotate:旋转效果

4.Translate:移动效果


使用Tweened Animations的步骤
1.创建一个AnimationSet对象。
2.根据需要创建相应的Animation对象
3.根据软件动画的需求,为Animation对象设置相应的数据。
4.将Animation对象添加到AnimationSet对象当中。
5.使用控件对象开始执行AnimationSet。

Tween Animations的通用属性
1.setDuration(long durationMills)
    设置动画持续时间(单位毫秒)
2.setFillAfter(boolean fillAfter)
    如果fillAfter的值为true,则动画执行后,控件将停留在执行结束的状态。
3.setFillBefore(boolean fillBefore)
    如果fillBefore的值为true,则动画执行后,控件将回到动画执行前的状态。
4.setStartOffSet(long startOffSet)
    设置动画执行之前的等待时间。
5.setRepeatCount(int repeatCount)
    设置动画重复执行的次数。



先以Alpha为例,假设我们是用一个按钮来触发Animations,然后以一个ImageView来进行动画效果的演示。我们可以这样来实现按钮监听器的onClick方法。
(这里假设所有控件均已经findViewById,创建好控件对象)
// 创建一个AnimationSet对象
AnimationSet animationSet = new AnimationSet(true);
// 创建一个AlphaAnimation对象,两个参数表示从一个什么透明度变化到什么透明度,1代表不透明,0代表完全透明。
AlphaAnimation alphaAnimation = new AlphaAnimation(1,0);
// 表示此动画执行的时间,以毫秒为单位
alphaAnimation.setDuration(1000);
// 将AlphaAnimation对象添加到AnimationSet当中
animationSet.addAnimation(alphaAnimation);
// ImageView对象开始动画 
imageView.startAnimation(animationSet);


接下来是Scale,假设条件与Alpha一样。onClick方法:
// 创建一个AnimationSet对象
AnimationSet animationSet = new AnimationSet(true);
// 创建一个scaleAnimation对象,
// 第一个参数,X轴方向的原始大小。第二个参数:X轴方向变化后的大小。
// 第三个参数,Y轴方向的原始大小。第四个参数:Y轴方向变化后的大小。
// 第五六七八个参数,与下一个Rotate的类似。
ScaleAnimation scaleAnimation = new scaleAnimation(1, 0.1f, 1, 0.1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
// 表示此动画执行的时间,以毫秒为单位
scaleAnimation.setDuration(1000);
// 将scaleAnimation添加到AnimationSet当中
animationSet.addAnimation(scaleAnimation);
// ImageView对象开始动画 
imageView.startAnimation(animationSet);


Rotate。onClick方法:
// 创建一个AnimationSet对象
AnimationSet animationSet = new AnimationSet(true);
// 创建一个RotateAnimation对象
// 第一个参数:开始旋转的角度;第二个参数:旋转到的角度;
// 后四个参数用来设置旋转轴的圆心:
// 第三个参数:X轴坐标类型。有ABSOLUTE,RELATIVE_TO_SELF,RELATIVE_TO_PARENT三种。第四个参数:与第三个参数相对应来设置
// 第五个参数:Y轴坐标类型。有ABSOLUTE,RELATIVE_TO_SELF,RELATIVE_TO_PARENT三种。第六个参数:与第三个参数相对应来设置
RotateAnimation rotateAnimation = new RotateAnimation(0,360,Animation.RELATIVE_TO_PARENT,1f,Animation.RELATIVE_TO_PARENT,0f);
// 表示此动画执行的时间,以毫秒为单位
rotateAnimation.setDuration(1000);
// 将rotateAnimation添加到AnimationSet当中
animationSet.addAnimation(rotateAnimation);
// ImageView对象开始动画 
imageView.startAnimation(animationSet);



Translate。onClick方法:
// 创建一个AnimationSet对象
AnimationSet animationSet = new AnimationSet(true);
// 创建一个TranslateAnimation对象
TranslateAnimation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,1.0f);
// 表示此动画执行的时间,以毫秒为单位
translateAnimation.setDuration(1000);
// 将translateAnimation添加到AnimationSet当中
animationSet.addAnimation(translateAnimation );
// ImageView对象开始动画 
imageView.startAnimation(animationSet);



用代码来实现,在调试方面会很方便,但是,它也有它的弱点,这样会降低了它的代码复用性。
因此,我们可以在xml文件当中来设置动画,这样可以提高了代码的复用性,也提高了代码的可维护性。
而用xml文件来设置动画,由于它没有一个编译的过程,因而,我们在调试程序的过程中会更加地困难一些。

下面是用xml来设置动画的步骤:
1.在res文件夹下面新建一个名为anim的文件夹。

2.创建xml文件,并首先加入set标签,改标签如下:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:interpolator="@android:anim/accelerate_interpolator">
</set>

3.在该标签当中加入rotate,alpha,scale或者translate标签。

4.在代码当中使用AnimationUtils当中装载xml文件,并生成Animation对象。


Alpha的xml文件编写方法:
<alpha
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="3000"/>

Rotate的xml文件编写方法:
<rotate
android:fromDegrees="0"
android:toDegrees="+350"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000"/>
注:android:pivotX的值共有三种设置方法:
1.android:pivot="50"这种方法使用绝对位置定位。
2.android:pivot="50%"这种方法相对于控件本身定位。
3.android:pivot="50%p"这种方法相对于控件的父控件定位。

Translate的xml文件编写方法
<translate
android:fromXDelta="50%"
android:toXDelta="100%"
android:fromYDelta="0%"
android:toYDelta="100%"
android:duration="2000"/>
注:fromXDelta,toXDelta,fromYDelta,toYDelta的值与Rotate上的说明一样。

Scale的xml文件编写方法
<scale
android:fromXScale="1.0"
android:toXScale="0.0"
android:fromYScale="1.0"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"/>


下面是代码里如何引用这些动画:
以在Alpha的触发按钮里onClick方法为例,其他几种动画的设置方法一样,只需要在loadAnimation里引用相应的ID即可(第一个参数是自己编写的Activity类对象):
// 装载动画设置文件
Animation animation = AnimationUtils.loadAnimation(YourActivity.this, R.anim.alpha);
// 在上面的代码中,我们传进去的是AnimationSet,因为AnimationSet是Animation的子类
imageView.startAnimation(animation);

0 0
原创粉丝点击