动画大家都很熟悉了,最近在研究动画,对TranslateAnimation的构造方法和XML文件写法有些迷惑,就多实验了几次,进行总结一下:
1、 构造函数
- 第一种
TranslateAnimation translateAnimation=new TranslateAnimation(300,500,300,500);
构造函数:
public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {}
这个用的频率比较高
fromXDelta:动画开始时X的起点坐标
toXDelta:动画结束时X的终点坐标
fromYDelta:动画开始时Y的起点坐标
toYDelta:动画结束时Y的终点坐标
- 第二种
TranslateAnimation translateAnimation=new TranslateAnimation(TranslateAnimation.RELATIVE_TO_PARENT,0.9f,TranslateAnimation.RELATIVE_TO_PARENT,0.5f,TranslateAnimation.RELATIVE_TO_PARENT,0f,TranslateAnimation.RELATIVE_TO_PARENT,0f);
构造函数:
public TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue,
int fromYType, float fromYValue, int toYType, float toYValue) {}
简单说一下,这里面提到了一个Type,先来看看Type都有什么:
public static final int ABSOLUTE = 0;
注释:The specified dimension is an absolute number of pixels.
从这个翻译上就能很清除的明白指定一个尺寸是像素的绝对值。
也就是说可以在上面写数字,写的数字就是屏幕上的像素,比如说要从(0,0)点运动到(100,100)这个点,那么这个值就应该传递为:
TranslateAnimation(
TranslateAnimation.ABSOLUTE,0,TranslateAnimation.ABSOLUTE,100,TranslateAnimation.ABSOLUTE,0,TranslateAnimation.ABSOLUTE ,100) {
}
其实大家不难发现,调用四个参数的构造函数和调用八个参数的构造函数是一样的:
public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {
mFromXValue = fromXDelta;
mToXValue = toXDelta;
mFromYValue = fromYDelta;
mToYValue = toYDelta;
mFromXType = ABSOLUTE;
mToXType = ABSOLUTE;
mFromYType = ABSOLUTE;
mToYType = ABSOLUTE;
}
看到了吧,这里把type自动加上了ABSOLUTE。
public static final int RELATIVE_TO_SELF = 1;
注释:The specified dimension holds a float and should be multiplied by the height or width of the object being animated.
意思就是说你设置完RELATIVE_TO_SELF这个类型之后,你所填写的值应该是浮点型的,这个值会乘以被调用执行动画对象的宽和高。
比如说你设置了一个Text View,那么这个浮点值就会分别乘以你这个TextView的宽和高,从常量名字也能看出来——相对自己。
public static final int RELATIVE_TO_PARENT = 2;
注释:这个跟上面的RELATIVE_TO_SELF很相似,只不过这个是乘以执行动画对象父布局(View)
对于构造函数以上就说两种
2、XML文件写法
大家都知道不仅可以通过代码实现动画,还可以使用res/anim/xxx.xml文件去配置动画,在这里我就只探讨,上面说的那三种常量在XML文件中怎么表示:
public static final int ABSOLUTE = 0;
public static final int RELATIVE_TO_SELF = 1;
public static final int RELATIVE_TO_PARENT = 2;
- ABSOLUTE在XML写法,直接在XML中写上数字就行了,因为是代表像素的绝对值。
public static final int ABSOLUTE = 0;
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="100"
- RELATIVE_TO_SELF在XML写法,因为是相对自己的,所以在写的时候要在末尾的位置加上%。
public static final int RELATIVE_TO_SELF = 1;
注意:这里一定要写成50%,而不要携程0.5,后者就会变成,绝对值写法了(ABSOLUTE)
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="50%"
- RELATIVE_TO_PARENT在XML写法,这个是相当于与父布局(View),所以要在末尾加上%p。
public static final int RELATIVE_TO_PARENT = 2;
该下面的代码意为被执行动画的View,移动到父布局50%的位置。
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="50%p"
对于我上面所说的XML如果有怀疑的地方,大家可以自己实验一下,实验方法很简单,写两个demo,一个demo用代码实现,另一个demo用XML实现,看看动画移动的位置是否和我以上总结的一样。