Android 动画基础-自定义动画

  自定义动画是非常简单的,我们只需要继承于Animation类,然后实现applyTransformation方法就行,同时我们还需要重写父类的initialize方法来实现一些初始化的工作。

1.实现applyTransformation方法

protected void applyTransformation(float interpolatedTime, Transformation t)

  上面的方法就是需要我们实现的方法。
  其中,第一个参数interpolatedTime是插值器的时间因子,这个因子是有动画当前完成的百分比和当前时间对应的插值所计算得来的,取值范围为0到1.0。
  第二个参数Transformation是一个矩阵的封装类,一般会使用这个类来获取当前动画的矩阵。

2.使用Camera类来实现动画效果

  值得注意的是:这个Camera类不是手机中的相机类,相机类的完整名字是--android.hardware.Camera;而当前的Camera类的完整名字是--android.graphics.Camera,这个类主要是实现一些3D动画效果。

//从t中获取当前的动画矩阵
        Matrix matrix = t.getMatrix();
        /*
         *save方法在这里主要是保存动画最原始的状态
         * 然后后面的旋转则是从最原始的状态开始旋转
         */
        mCamera.save();
        mCamera.rotateY(720 * interpolatedTime);
        mCamera.getMatrix(matrix);
        /*
         *restore方法主要是将当前Camera的状态恢复为在栈中的状态
         * 以保证每次旋转都是从最开始的状态开始旋转的
         */
        mCamera.restore();
        /*
         *在默认的情况下,旋转一个控件是从x = 0这个轴开始的(这里的x是相对于要旋转的控件来说的, 这里的y是不管得)。
         * 当我们preTranslate(-mCenterWidth, -mCenterHeight)的时候,相当于是把当前控件的中心移动到(0,0)来。
         * 当旋转开始的时候,则是从x = mCenterWidth开始旋转的。
         * 
         */
        matrix.preTranslate(mCenterWidth, mCenterHeight);
        matrix.postTranslate(-mCenterWidth, -mCenterHeight);

3.重写initialize方法

  在initialize方法里面通常设置一些动画的基本参数。例如动画持续时间,动画重复次数等等之类的。

public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        setDuration(5000);
        setFillAfter(true);
        setInterpolator(new LinearInterpolator());
        mCenterWidth = width / 2;
        mCenterHeight = height / 2;
    }

你可能感兴趣的:(Android 动画基础-自定义动画)