1.简介
补间动画有4种基本类型:translate , rotate , scale , alpha
如果要其他效果,就要自定义补间动画。
2.写一个自定义动画类继承Animation
并且重写applyTransformation方法,该方法用于实现具体动画变换逻辑
public class MyTweenAnimation extends Animation {
private float mCenterX;
private float mCenterY;
private int mDuration;
private Camera mCamera = new Camera(); //控制自定义动画//主要实现3D的变形,有转动,旋转等,Camera的源码是由Native(本地代码)实现
public MyTweenAnimation(float x, float y, int duration) {
this.mCenterX = x;
this.mCenterY = y;
this.mDuration = duration;
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
// 设置动画持续时间
setDuration(mDuration);
// 设置动画结束后效果保留
setFillAfter(true);
// 设置匀速变换
setInterpolator(new LinearInterpolator());
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
mCamera.save(); //A保存当前状态
// translate:在x,y,z三位控件内进行平移
// rotateX:以(0.0)为中心,绕X轴进行选择
// rotateY:以(0.0)为中心,绕Y轴进行选择
// rotateZ:以(0.0)为中心,旋转
//interpolatedTime是抽象的时间参数,表示动画的时间进行比,从0~1。
//根据interpolatedTime时间来控制x、y、z轴上的偏移
// mCamera.translate(100.0f - 100.0f * interpolatedTime, 150.0f * interpolatedTime - 150
// , 80.0f - 80.0f * interpolatedTime);
//根据interpolatedTime时间在x轴上旋转不同角度
// mCamera.rotateX(360 * interpolatedTime);
//根据interpolatedTime时间在y轴上旋转不同角度
// mCamera.rotateY(360 * interpolatedTime);
//根据interpolatedTime时间在z轴上旋转不同角度
mCamera.rotateZ(360*interpolatedTime);
//Transformation表示不同时刻view的变形程度
// 获取Transformation参数的Matrix对象
Matrix matrix = t.getMatrix();
// 将Camera所做的变换应用到Transformation的Matrix上
//getMatrix方法来获取这个坐标矩阵
mCamera.getMatrix(matrix);
//默认的view坐标系原点在(0.0)
//一般用dp的Imagevie的数值乘以3等于float,所以下面乘以约等于3(自己测试的,并不准确)
matrix.preTranslate(-mCenterX*3 , -mCenterY*3);//动画开始前,view坐标系向右移到图片width/2处,向下移到图片height/2出、、这样中心点到了图片中央位置
matrix.postTranslate(mCenterX*3 , mCenterX*3);//动画结束后,view坐标系回归原位
mCamera.restore();//A回复当前状态
}
}
3.使用
//自定义补间动画
//imag3是100X100,将中心点传入
MyTweenAnimation animation = new MyTweenAnimation(50 , 50, 5000);
imag3.setAnimation(animation);