android图片3d旋转
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
看到很多人在问如何实现三维的翻转效果,所以今天在这里简单的给大家分析一下,其实在APIDemo中就有这样一个例子,那么我们就以其为例来学习Android中的翻转动画效果的实现,首先看一下运行效果如下图所示。
Android中并没有提供直接做3D翻转的动画,所以关于3D翻转的动画效果需要我们自己实现,那么我们首先来分析一下Animation 和Transformation。
Animation动画的主要接口,其中主要定义了动画的一些属性比如开始时间,持续时间,是否重复播放等等。而Transformation中则包含一个矩阵和alpha值,矩阵是用来做平移,旋转和缩放动画的,而alpha值是用来做alpha动画的,要实现3D旋转动画我们需要继承自Animation类来实现,我们需要重载getTransformation和applyTransformation,在getTransformation中Animation会根据动画的属性来产生一系列的差值点,然后将这些差值点传给applyTransformation,这个函数将根据这些点来生成不同的Transformation。下面是具体实现:
1.public class Rotate3dAnimation extends Animation {
2.//开始角度
3. private final float mFromDegrees;
4.//结束角度
5. private final float mToDegrees;
6.//中心点
7. private final float mCenterX;
8. private final float mCenterY;
9. private final float mDepthZ;
10.//是否需要扭曲
11. private final boolean mReverse;
12.//摄像头
13. private Camera mCamera;
14. public Rotate3dAnimation(float fromDegrees, float toDegrees,
15. float centerX, float centerY, float depthZ, boolean reverse) {
16. mFromDegrees = fromDegrees;
17. mToDegrees = toDegrees;
18. mCenterX = centerX;
19. mCenterY = centerY;
20. mDepthZ = depthZ;
21. mReverse = reverse;
22. }
23.
24. @Override
25. public void initialize(int width, int height, int parentWidth, int par
entHeight) {
26. super.initialize(width, height, parentWidth, parentHeight);
27. mCamera = new Camera();
28. }
29.//生成Transformation
30. @Override
31. protected void applyTransformation(float interpolatedTime, Transformat
ion t) {
32. final float fromDegrees = mFromDegrees;
33.//生成中间角度
34. float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interp
olatedTime);
35.
36. final float centerX = mCenterX;
37. final float centerY = mCenterY;
38. final Camera camera = mCamera;
39.
40. final Matrix matrix = t.getMatrix();
41.
42. camera.save();
43. if (mReverse) {
44. camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);
45. } else {
46. camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTim
e));
47. }
48. camera.rotateY(degrees);
49.//取得变换后的矩阵
50. camera.getMatrix(matrix);
51. camera.restore();
52.
53. matrix.preTranslate(-centerX, -centerY);
54. matrix.postTranslate(centerX, centerY);
55. }
56.}
其中包括了旋转的开始和结束角度,中心点、是否扭曲、和一个Camera,这里我们主要分析applyTransformation函数,其中第一个参数就是通过getTransformation函数传递的差指点,然后我们根据这个差值通过线性差值算法计算出一个中间角度degrees,Camera 类是用来实现绕Y轴旋转后透视投影的,因此我们首先通过t.getMatrix()取得当前的矩阵,然后通过camera.translate来对矩阵进行平移变换操作,camera.rotateY进行旋转。这样我们就可以很轻松的实现3D旋转效果了,该例子的原意是通过一个列表来供用户选择要实现翻转的图像,所以我们分析至少需要定义两个控件:ListView和ImageView(要翻转的图像),主界面的xml布局定义如下所示。
1. 2. android:id="@+id/container" 3. android:layout_width="match_parent" 4. android:layout_height="match_parent"> 5. 6. 7. android:id="@android:id/list" 8. android:persistentDrawingCache="animation|scrolling" 9. android:layout_width="match_parent" 10. android:layout_height="match_parent" 11. android:layoutAnimation="@anim/layout_bottom_to_top_slide" /> 12. 13. 14. android:id="@+id/picture" 15. android:scaleType="fitCenter" 16. android:layout_width="match_parent" 17. android:layout_height="match_parent" 18. android:visibility="gone" /> 19. 20.