大家好,欢迎来到IT知识分享网。
概要:
Roate3dAnimation 实现了围绕y轴竖直方向 或者绕x轴方向旋转的3d动画效果。这个例子来
自Android APIDemo中的一个自定义View动画。他的实现展示自定义View动画的基本步骤。
主要是重写initialize方法,applyTransformation方法。
分析:
在Roate3dAnimation中,我们使用Android.graphic.Camera实现3d效果。
对Camera不熟悉的可看看android.graphic.Camera。
public class Rotate3dAnimation extends Animation {
//开始角度
private float startDegree;
//结束角度
private float endDegree;
/**
* 这个旋转动画围绕在2D空间的中心点执行.你可以用X轴坐标(叫做centerX)和Y轴(叫做centerY)
* 坐标来定义这个中心点
*/
private float centerX;
private float centerY;
/**
* 控制镜头景深,不需要的话给0值即可
* mReverse 为true,表示反方向,false 表示正方向
*/
private float deepZ;
private boolean mReverse;
//用于辅助实现3d效果。
private Camera mCamera;
//X轴方向,或Y轴方向
enum DIRECTION {
X, Y
}
DIRECTION direction = DIRECTION.Y;
Rotate3dAnimation(float fromDegree, float toDegree, float centerX,
float centerY, float deepZ, boolean reverse) {
this.startDegree = fromDegree;
this.endDegree = toDegree;
this.centerX = centerX;
this.centerY = centerY;
this.deepZ = deepZ;
this.mReverse = reverse;
}
Rotate3dAnimation(float fromDegree, float toDegree, float centerX,
float centerY, float deepZ, boolean reverse, DIRECTION direction) {
this.startDegree = fromDegree;
this.endDegree = toDegree;
this.centerX = centerX;
this.centerY = centerY;
this.deepZ = deepZ;
this.mReverse = reverse;
this.direction = direction;
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
mCamera = new Camera();
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
float fromDegree = startDegree;
float degree = fromDegree + (endDegree - startDegree) * interpolatedTime;
final Matrix matrix = t.getMatrix();
mCamera.save();
if (mReverse) {
mCamera.translate(0, 0, deepZ * interpolatedTime);
} else {
mCamera.translate(0, 0, deepZ * (1 - interpolatedTime));
}
if (direction == DIRECTION.Y) {
mCamera.rotateY(degree);
} else {
mCamera.rotateX(degree);
}
mCamera.getMatrix(matrix);
mCamera.restore();
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
}
应用:
iv_content.post(new Runnable() {
@Override
public void run() {
Rotate3dAnimation rotate3dAnimation = new Rotate3dAnimation(0, 360, iv_content.getWidth()/2,
0, 0, true, Rotate3dAnimation.DIRECTION.Y);
rotate3dAnimation.setDuration(3000);
iv_content.setAnimation(rotate3dAnimation);
rotate3dAnimation.start();
}
});
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24805.html