看到很多人在问如何实现三维的翻转效果,所以今天在这里简单的给大家分析一下,其实在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小时内删除。