Android中动画可分为三种:View动画、帧动画和属性动画,其中View动画和属性动画通过对场景里的对象不断做图像变换(平移、缩放、旋转、透明度)从而产生动画效果,而缩放和旋转动画中有轴点的概念。默认情况下轴点是View的中心点,如缩放动画在水平方向上进行缩放的话会导致View向左右两个方向同时进行缩放,旋转动画会绕中心点进行旋转。那么这两种动画如何设置其轴点呢?
对于View动画,其提供了相应的方法直接设置动画的轴点:
//缩放动画
ScaleAnimation scaleAnimation = new ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY);
ScaleAnimation scaleAnimation = ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue);
//旋转动画
RotateAnimation rotateAnimation = new RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY);
RotateAnimation rotateAnimation = new RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue);
pivotX、pivotY,pivotXValue、pivotYValue表示轴点的坐标,表示轴点的坐标,pivotXType、pivotYType分别表示动画在X轴和Y轴相对于物件位置类型,共有三种类型:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT,默认值为Animation.ABSOLUTE。
对于属性动画,并没有直接提供设置轴点的动画,我们需要在执行某个View的属性动画前设置View的轴点。
View.setPivotX(float pivotX);
View.setPivotY(float pivotY);
其中pivotX和pivotY是相对于该View左上角的坐标值而非相对于整个屏幕左上角的坐标值。如若需要让View绕着底部的中点进行旋转,可设置轴点为:
View.setPivotX(View.getWidth() / 2);
View.setPivotY(View..getHeight());
这里需要注意的是,在onCreate、onStart、onResume中均无法正确得到某个View的宽/高信息,这是因为View的measure过程和Activity的生命周期方法不是同步执行的,因此无法保证Activity执行了onCreate、onStart、onResume时某个View已经测量完毕了,如果View还没有测量完毕,那么获得的宽/高就是0。
可以通过View.post(runnable)方法获取View的宽高,通过post可以将一个runnable投递到消息队列的尾部,然后等待Looper调用此runnable的时候,View也已经初始化好了:
view.post(new Runnable() {
@Override
public void run() {
View.setPivotX(View.getWidth() / 2);
View.setPivotY(View..getHeight());
}
});
这样就把View的轴点设置为了View底部的中点了,然后再执行相应的属性动画即可。