3D动画
2015-08-27 11:46
302 查看
在学习实现Android的3D旋转动画效果,在网上查到的文章全是长篇大论,花好半天看明白来,最终别人的方法由于种种原因,还不一定适合自己的需求,其实我就只想知道最简单的实现方式,对旋转动画的参数设置等可以等先明白了最简单的实现方法之后再一个个研究,但为什么总是为了知道这个最简单的实现方式,要看一大堆作者自己的应用里的一大堆令人头疼程序逻辑呢。
好不容易看明白这些逻辑之后,把自己最想知道的那一部分给抽取出来,写了一个很简单的示例,有效代码也就十几行,我想这区区十几行代码应该不会令人头疼了吧。
package com.example.test;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.TextView;
import android.app.Activity;
import android.graphics.Camera;
import android.graphics.Matrix;
public class TestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("3D Rotate");
Rotate3d rotate = new Rotate3d();
rotate.setDuration(1000);
tv.startAnimation(rotate);
setContentView(tv);
}
}
class Rotate3d extends Animation {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
Matrix matrix = t.getMatrix();
Camera camera = new Camera();
camera.save();
// 设置camera动作为绕Y轴旋转
// 总共旋转180度,因此计算在每个补间时间点interpolatedTime的角度即为两着相乘
camera.rotateY(180 * interpolatedTime);
// 根据camera动作产生一个matrix,赋给Transformation的matrix,以用来设置动画效果
camera.getMatrix(matrix);
camera.restore();
}
}
上述动画会转出屏幕,这时就需要对动画进行参数设置了,在明白了动画的实现方法之后,对一个个参数的设置不就容易的多了吗。下面代码中的注释部分即上再上述代码的基础上添加的设置旋转中心的过程,这样就可以使上述动画不会转出屏幕了。
package com.example.test;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.TextView;
import android.app.Activity;
import android.graphics.Camera;
import android.graphics.Matrix;
public class TestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("3D Rotate");
Rotate3d rotate = new Rotate3d();
rotate.setDuration(1000);
// tv.measure(0, 0);
// rotate.setCenter(tv.getMeasuredWidth() / 2, tv.getMeasuredHeight() / 2);
// rotate.setFillAfter(true); // 使动画结束后定在最终画面,如果不设置为true,则将会回到初始画面
tv.startAnimation(rotate);
setContentView(tv);
}
}
class Rotate3d extends Animation {
// private float mCenterX = 0;
// private float mCenterY = 0;
//
// public void setCenter(float centerX, float centerY) {
// mCenterX = centerX;
// CenterY = centerY;
// }
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
Matrix matrix = t.getMatrix();
Camera camera = new Camera();
camera.save();
camera.rotateY(180 * interpolatedTime);
camera.getMatrix(matrix);
camera.restore();
// matrix.preTranslate(-mCenterX, -mCenterY);
// matrix.postTranslate(mCenterX, mCenterY);
}
}
好不容易看明白这些逻辑之后,把自己最想知道的那一部分给抽取出来,写了一个很简单的示例,有效代码也就十几行,我想这区区十几行代码应该不会令人头疼了吧。
package com.example.test;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.TextView;
import android.app.Activity;
import android.graphics.Camera;
import android.graphics.Matrix;
public class TestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("3D Rotate");
Rotate3d rotate = new Rotate3d();
rotate.setDuration(1000);
tv.startAnimation(rotate);
setContentView(tv);
}
}
class Rotate3d extends Animation {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
Matrix matrix = t.getMatrix();
Camera camera = new Camera();
camera.save();
// 设置camera动作为绕Y轴旋转
// 总共旋转180度,因此计算在每个补间时间点interpolatedTime的角度即为两着相乘
camera.rotateY(180 * interpolatedTime);
// 根据camera动作产生一个matrix,赋给Transformation的matrix,以用来设置动画效果
camera.getMatrix(matrix);
camera.restore();
}
}
上述动画会转出屏幕,这时就需要对动画进行参数设置了,在明白了动画的实现方法之后,对一个个参数的设置不就容易的多了吗。下面代码中的注释部分即上再上述代码的基础上添加的设置旋转中心的过程,这样就可以使上述动画不会转出屏幕了。
package com.example.test;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.TextView;
import android.app.Activity;
import android.graphics.Camera;
import android.graphics.Matrix;
public class TestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("3D Rotate");
Rotate3d rotate = new Rotate3d();
rotate.setDuration(1000);
// tv.measure(0, 0);
// rotate.setCenter(tv.getMeasuredWidth() / 2, tv.getMeasuredHeight() / 2);
// rotate.setFillAfter(true); // 使动画结束后定在最终画面,如果不设置为true,则将会回到初始画面
tv.startAnimation(rotate);
setContentView(tv);
}
}
class Rotate3d extends Animation {
// private float mCenterX = 0;
// private float mCenterY = 0;
//
// public void setCenter(float centerX, float centerY) {
// mCenterX = centerX;
// CenterY = centerY;
// }
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
Matrix matrix = t.getMatrix();
Camera camera = new Camera();
camera.save();
camera.rotateY(180 * interpolatedTime);
camera.getMatrix(matrix);
camera.restore();
// matrix.preTranslate(-mCenterX, -mCenterY);
// matrix.postTranslate(mCenterX, mCenterY);
}
}
相关文章推荐
- oldssoj2676B(环)
- Download pdf file from JAX-RS
- C++ Jsoncpp源代码编译与解析Json
- 安卓笔记
- iOS:NSBundle的具体介绍
- 如何使用Xmanager及VNC登录远程桌面
- 字符串组合问题(无重复)
- Ruby第三天作业
- php调用短信接口,php发送短信接口
- Google Earth For Javascript 谷歌地球删除所有标记
- kafka学习(三)--java开发(基于kafka0.8版本)
- 提供语义分析和分词服务
- IOS-笔记16(Animation)
- configure: error: cannot run /bin/sh ./config.sub解决办法
- 迭代模式
- 为什么要使用SLF4J而不是Log4J
- Microsoft Edge 浏览器开始支持webkit私有样式
- easyui 自定义校验使用ajax方式。
- ECharts实例开发学习笔记一
- Emacs编辑器之Python与Perl的IDE环境配置