Android图形图像之自定义补间动画

前言


    Activity之间的页面跳转,很多时候为了美观,都会在页面跳转的过程中加上动画,这样不会给用户一种生硬的感觉。那么怎么实现呢? 我们可以通过自定义补间动画来实现这个效果。前面用总结了补间动画,有需要可以看一下。实现自定义补间动画并不难,我们直接继承animation,然后重写里面的方法即可实现。

简介


    我们继承并重写的两个方法分别是:

initialize(int width,int height,int parentWidth,
int parentHeight)

applyTransformation(float interpolatedTime, Transformation t)

initialize()这个方法主要是初始化animation对象的一些大小,状态信息等。
applyTransformation() 这是这子类继承必须实现的方法(我们为了定制我们需要的效果,如果不重写,那自然就没有了继承的必要),该方法主要是控制变化的效果。interpolatedTime是一个从0→1的数字,最开始的时候这个interpolatedTime等于0,结束的时候为最大等于1,在动画进行的过程中,interpolatedTime的增速是有我们在initialize()设置的setInterpolator()决定的;Transformation 是 在动画进行的过程中不同的时间点的形状。

详解Animation的3D效果


    Android提供了一个Camera开进行3D变化,但是令人奇怪的是,这个Camera是来自包(import android.graphics.Camera;),在Android控制摄像头的一个类也是Camera类,不明白Googl为什么会取同样的名字混淆开发者。
从源代码中,我们发现在Camera中封装了一个Matrix,能够进行位移,旋转等。


Android图形图像之自定义补间动画_第1张图片


Camera所支持的三维空间效果,在手机上展示的效果如下:

Android图形图像之自定义补间动画_第2张图片


Camera的方法

方法 说明
rotateX(float x) 沿着X轴进行旋转
rotateY(float y) 沿着Y轴进行旋转
rotateZ(float z) 沿着Z轴进行旋转
tranlate(float x, float y, float z) 在三维空间分别对X,Y,Z方向的偏移


下面我们通过一个Demo来演示一下。通过拖动SeekBar控制旋转的大小,动画的时间设为3s。
rotateX(int x)绕X轴效果展示


Android图形图像之自定义补间动画_第3张图片

rotateY(int y)绕Y轴效果展示

Android图形图像之自定义补间动画_第4张图片

rotateZ(int z)绕Z轴效果展示

Android图形图像之自定义补间动画_第5张图片



translate(int x, int y, int z)演示

X偏移

Android图形图像之自定义补间动画_第6张图片

Y偏移X偏移一样,只是向上而已,我们就不解释了,看一下Z方向的偏移,Z偏移出现了一种近大远小的透视效果


Android图形图像之自定义补间动画_第7张图片

最后我们看一下自定义补间动画的效果吧

Android图形图像之自定义补间动画_第8张图片

重写Animation

JAVA代码

public class Anima extends Animation {
    private float centerX;
    private float centerY;
    private int duration;
    private Camera camera = new Camera();

    public Anima(float x, float y, int duration) {
        this.centerX = x;
        this.centerY = y;
        this.duration = duration;
    }

    @Override
    public void initialize(int width, int height, int parentWidth,
            int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        setDuration(duration);
        setFillAfter(false);
        setInterpolator(new LinearInterpolator());
    }

    @Override
    public void applyTransformation(float interpolatedTime, Transformation t) {
        camera.save();
        camera.translate(bean.getTran_x(), bean.getTran_y(), bean.getTran_z());
        camera.rotateX(bean.getRotate_x()*interpolatedTime);
        camera.rotateY(bean.getRotate_y()*interpolatedTime);
        camera.rotateZ(bean.getRotate_z()*interpolatedTime);
        Matrix matrix = t.getMatrix();
        camera.getMatrix(matrix);
        matrix.preTranslate(-centerX, -centerY);
        matrix.postTranslate(centerX, centerY);
        camera.restore();

    }

}

总结


    自认为我讲解的很简单,而且内容本来也就不难,难的内容只是也没有修炼到家,写不了。现在在写博文的时候感觉到在语言的组织上还存在着很多问题,老是词不达意,这点很重要。要改,在博客上面记录了我的学习历程,也希望帮助到别人,如果对您没有帮助,或者你本来就是大神,这里肯定容不下您,庙太小了,也请不要骂我。为了这篇博文,从早上忙到现在,现在该睡午觉去了,睡醒了去健身,程序员没有一个健康的体魄肯定不可以。

演示Demo

下载地址:点击下载



——————————————————————————————-

欢迎转载,尊重作者劳动成果,转载请务必注明出处
技术因分享而饱含生机

——————————————————————————————-

你可能感兴趣的:(Android图形图像之自定义补间动画)