android 动画x轴旋转,Android Roate3dAnimation实现围绕y轴竖直方向或者绕x轴方向旋转的3d动画效果...
发布日期:2022-02-18 13:08:16 浏览次数:6 分类:技术文章

本文共 2784 字,大约阅读时间需要 9 分钟。

概要:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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://blog.csdn.net/weixin_28871097/article/details/117285853 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:android contentresolver权限,求助关于getcontentresolver().query()
下一篇:android 8.0可以实现后台包活么,Android 8.0 应用保活实践 · Jaqen Ng

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月07日 20时25分57秒