自定义补间动画

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);

4.就是要简单明了






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值