看到很多人在问如何实现三维的翻转效果,所以今天在这里简单的给大家分析一下,其实在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 parentHeight) {
26. super.initialize(width, height, parentWidth, parentHeight);
27. mCamera = new Camera();
28. }
29. //生成Transformation
30. @Override
31. protected void applyTransformation(float interpolatedTime, Transformation t) {
32. final float fromDegrees = mFromDegrees;
33. //生成中间角度
34. float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);
35.
36. final float centerX = mCenterX;
37. final float centerY = mCenterY;
38. final Camera camera = mCamera;
39.
40. final Matrix matrix =&Matrix();
41.
42. camera.save();
43. if (mReverse) {
44. anslate(0.0f, 0.0f, mDepthZ * interpolatedTime);
45. } else {
46. anslate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));
47. }
48. ateY(degrees);
49. //取得变换后的矩阵
50. Matrix(matrix);
51. store();
52.
53. matrix.preTranslate(-centerX, -centerY);
54. matrix.postTranslate(centerX, centerY);
55. }
56. }
其中包括了旋转的开始和结束角度,中心点、是否扭曲、和一个Camera,这里我们主要分析applyTransformation函数,其中第一个参数就是通过getTransformation函数传递的差指
点,然后我们根据这个差值通过线性差值算法计算出一个中间角度degrees,Camera类是用来实现绕Y轴旋转后透视投影的,因此我们首先通过t.getMatrix()取得当前的矩阵,然后通过anslate来对矩阵进行平移变换操作,ateY进行旋转。这样我们就可以很轻松的实现3D旋转效果了,该例子的原意是通过一个列表来供用户选择要实现翻转的图像,所以我们分析至少需要定义两个控件:ListView和ImageView(要翻转的图像),主界面的xml布局定义如下所示。
1. <FrameLayout xmlns:android="schemas.android/apk/res/android"
2. android:id="@+id/container"
3. android:layout_width="match_parent"
4. android:layout_height="match_parent">
5.
6. <ListView
7. android:id="@android:id/list"
8. android:persistentDrawingCache="animation|scrolling"
9. android:layout_width="match_parent"
10. rotate属性 android:layout_height="match_parent"
11. android:layoutAnimation="@anim/layout_bottom_to_top_slide" />
12.
13. <ImageView
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. </FrameLayout>
然后准备好需要的资源,在onCreate函数中准备好ListView和ImageView,因为要旋转所以我们需要保存视图的缓存信息,通过setPersistentDrawingCache(ViewGroup.PERSISTENT_ANIMATION_CACHE);可以设置该功能,当我们选择列表中的图像资源后在onItemClick中将选择的资源Id对应的图像设置到ImageView中,然后通过applyRotation来启动一个动画,前面有了Rotate3dAnimation的实现,我们要完成3D翻转动画就很简单,直接构建一个Rotate3dAnimation对象,设置其属性(包括动画监听),这里将动画的监听设置为DisplayNextView,可以用来显示下一个视图,在其中的动画结束监听(onAnimationEnd)中,通过一个县城SwapViews来交换两个画面,交换过程则是设置ImageView和ListView的显示相关属性,并构建一个Rotate3dAnimation对象,对另一个界面进行旋转即可,然后启动动画,整个转换过程实际上就是将第一个界面从0度转好90度,然后就爱你过第二个界面从90度转到0度,这样就形
成了一个翻转动画,完整代码如下,我们也加入了一些必要的注解,大家也可以参考APIDemo中的Transition3d例子。
1. public class Transition3d extends Activity implements
2. AdapterView.OnItemClickListener, View.OnClickListener {
3. //照片列表
4. private ListView mPhotosList;
5. private ViewGroup mContainer;
6. private ImageView mImageView;
7.
8. // 照片的名字,用于显示在list中
9. private static final String[] PHOTOS_NAMES = new String[] {
10. "Lyon",
11. "Livermore",
12. "Tahoe Pier",
13. "Lake Tahoe",
14. "Grand Canyon",
15. "Bodie"
16. };
17.
18. // 资源id
19. private static final int[] PHOTOS_RESOURCES = new int[] {
20. R.drawable.photo1,
21. R.drawable.photo2,
22. R.drawable.photo3,
23. R.drawable.photo4,
24. R.drawable.photo5,
25. R.drawable.photo6
26. };
27.
28. @Override
29. protected void onCreate(Bundle savedInstanceState) {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论