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,能够进行位移,旋转等。


这里写图片描述


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

这里写图片描述


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轴效果展示


这里写图片描述

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

这里写图片描述

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

这里写图片描述



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

X偏移

这里写图片描述

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


这里写图片描述

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

这里写图片描述

重写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

下载地址:点击下载



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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值