http://blog.csdn.net/sunboy_2050/article/details/7483166

前面介绍了利用Android自带的控件,进行滑动翻页制作效果,现在我们通过代码实现一些滑动翻页的动画效果。

Animation实现动画有两个方式:帧动画(frame-by-frame animation)和补间动画(tweened animation


本示例通过继承Animation自定义Rotate3D,实现3D翻页效果。效果图如下:



1、Rotate3D(Animation)

首先,自定义Animation的3D动画类Rotate3D

[java] view plain copy print ?
  1. publicclassRotate3DextendsAnimation{
  2. privatefloatfromDegree;//旋转起始角度
  3. privatefloattoDegree;//旋转终止角度
  4. privatefloatmCenterX;//旋转中心x
  5. privatefloatmCenterY;//旋转中心y
  6. privateCameramCamera;
  7. publicRotate3D(floatfromDegree,floattoDegree,floatcenterX,floatcenterY){
  8. this.fromDegree=fromDegree;
  9. this.toDegree=toDegree;
  10. this.mCenterX=centerX;
  11. this.mCenterY=centerY;
  12. }
  13. @Override
  14. publicvoidinitialize(intwidth,intheight,intparentWidth,intparentHeight){
  15. super.initialize(width,height,parentWidth,parentHeight);
  16. mCamera=newCamera();
  17. }
  18. @Override
  19. protectedvoidapplyTransformation(floatinterpolatedTime,Transformationt){
  20. finalfloatFromDegree=fromDegree;
  21. floatdegrees=FromDegree+(toDegree-fromDegree)*interpolatedTime;//旋转角度(angle)
  22. finalfloatcenterX=mCenterX;
  23. finalfloatcenterY=mCenterY;
  24. finalMatrixmatrix=t.getMatrix();
  25. if(degrees<=-76.0f){
  26. degrees=-90.0f;
  27. mCamera.save();
  28. mCamera.rotateY(degrees);//旋转
  29. mCamera.getMatrix(matrix);
  30. mCamera.restore();
  31. }elseif(degrees>=76.0f){
  32. degrees=90.0f;
  33. mCamera.save();
  34. mCamera.rotateY(degrees);
  35. mCamera.getMatrix(matrix);
  36. mCamera.restore();
  37. }else{
  38. mCamera.save();
  39. mCamera.translate(0,0,centerX);//位移x
  40. mCamera.rotateY(degrees);
  41. mCamera.translate(0,0,-centerX);
  42. mCamera.getMatrix(matrix);
  43. mCamera.restore();
  44. }
  45. matrix.preTranslate(-centerX,-centerY);
  46. matrix.postTranslate(centerX,centerY);
  47. }
  48. }

然后,实例化Rotate3D的旋转方向

[java] view plain copy print ?
  1. publicvoidinitAnimation(){
  2. //获取旋转中心
  3. DisplayMetricsdm=newDisplayMetrics();
  4. dm=getResources().getDisplayMetrics();
  5. mCenterX=dm.widthPixels/2;
  6. mCenterY=dm.heightPixels/2;
  7. //定义旋转方向
  8. intduration=1000;
  9. lQuest1Animation=newRotate3D(0,-90,mCenterX,mCenterY);//下一页的【question1】旋转方向(从0度转到-90,参考系为水平方向为0度)
  10. lQuest1Animation.setFillAfter(true);
  11. lQuest1Animation.setDuration(duration);
  12. lQuest2Animation=newRotate3D(90,0,mCenterX,mCenterY);//下一页的【question2】旋转方向(从90度转到0,参考系为水平方向为0度)(起始第一题)
  13. lQuest2Animation.setFillAfter(true);
  14. lQuest2Animation.setDuration(duration);
  15. rQuest1Animation=newRotate3D(0,90,mCenterX,mCenterY);//上一页的【question1】旋转方向(从0度转到90,参考系为水平方向为0度)
  16. rQuest1Animation.setFillAfter(true);
  17. rQuest1Animation.setDuration(duration);
  18. rQuest2Animation=newRotate3D(-90,0,mCenterX,mCenterY);//上一页的【question2】旋转方向(从-90度转到0,参考系为水平方向为0度)
  19. rQuest2Animation.setFillAfter(true);
  20. rQuest2Animation.setDuration(duration);
  21. }

2、Activity

首先,定义两个布局文件,用于旋转的画面切换

main.xml

[html] view plain copy print ?
  1. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2. android:id="@+id/layout_main"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:orientation="vertical">
  6. ...
  7. </LinearLayout>

next.xml

[html] view plain copy print ?
  1. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2. android:id="@+id/layout_next"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:orientation="vertical">
  6. ...
  7. </LinearLayout>
限于篇幅,完整布局文件请详见源码 ^_^


然后,初始化两个旋转的布局文件资源

[java] view plain copy print ?
  1. privatevoidinitMain(){
  2. setContentView(R.layout.main);
  3. layoutmain=(LinearLayout)findViewById(R.id.layout_main);
  4. btn_MainLast=(Button)findViewById(R.id.main_last);
  5. btn_MainNext=(Button)findViewById(R.id.main_next);
  6. btn_MainLast.setOnClickListener(listener);
  7. btn_MainNext.setOnClickListener(listener);
  8. }
  9. privatevoidinitNext(){
  10. setContentView(R.layout.next);
  11. layoutnext=(LinearLayout)findViewById(R.id.layout_next);
  12. btn_NextLast=(Button)findViewById(R.id.next_last);
  13. btn_NextNext=(Button)findViewById(R.id.next_next);
  14. btn_NextLast.setOnClickListener(listener);
  15. btn_NextNext.setOnClickListener(listener);
  16. }

最后,设置布局文件中的按钮监听事件,响应3D旋转动画和方向

[java] view plain copy print ?
  1. privateView.OnClickListenerlistener=newView.OnClickListener(){
  2. @Override
  3. publicvoidonClick(Viewv){
  4. switch(v.getId()){
  5. caseR.id.main_last://上一页
  6. layoutmain.startAnimation(lQuest1Animation);//当前页向左旋转(0,-90)
  7. initNext();
  8. layoutnext.startAnimation(lQuest2Animation);//下一页向左旋转(90,0)
  9. break;
  10. caseR.id.main_next://下一页
  11. layoutmain.startAnimation(rQuest1Animation);//当前页向右旋转(0,90)
  12. initNext();
  13. layoutnext.startAnimation(rQuest2Animation);//下一页向右旋转(-90,0)
  14. break;
  15. caseR.id.next_last:
  16. layoutnext.startAnimation(lQuest1Animation);
  17. initMain();
  18. layoutmain.startAnimation(lQuest2Animation);
  19. break;
  20. caseR.id.next_next:
  21. layoutnext.startAnimation(rQuest1Animation);
  22. initMain();
  23. layoutmain.startAnimation(rQuest2Animation);
  24. break;
  25. }
  26. }
  27. };


源码下载




参考推荐:

animation


更多相关文章

  1. Android(安卓)ProgressBar设置转圈样式
  2. android修改图片(修改图片大小,图片旋转,图片平移)
  3. Ophone倒转屏幕自适应问题
  4. Android视图的标签属性
  5. 继承Animation自定义动画
  6. Android中控制屏幕旋转的相关设置
  7. android中手势操作图片的平移、缩放、旋转
  8. android:screenOrientation的取值含义
  9. Android(安卓)程式开发:(七)处理变化 —— 7.3 检测屏幕的方向

随机推荐

  1. 使用Android自带Ant构建Apk
  2. Android基础之基本控件
  3. GoogleMap
  4. Android bt hid(bluedroid)和linux HID-sub
  5. Android存储权限
  6. 用PC应用程序通过USB读写Andriod里面的数
  7. Android 控件之DatePicker,TimePicker,Ca
  8. 解决Could not find method android() fo
  9. Android禁止横屏竖屏切换
  10. 改变android程序head样式