android图片3d旋转

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.

相关文档
最新文档