前言
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所支持的三维空间效果,在手机上展示的效果如下:
方法 | 说明 |
---|---|
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轴效果展示
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
下载地址:点击下载
技术因分享而饱含生机