time 
设为首页】【收藏本站
当前位置: 主页 > 电脑网络 > 操作系统 > 嵌入式 > Android > Android实现中轴旋转特效的图片浏览器

Android实现中轴旋转特效的图片浏览器

时间:2014-06-18 15:35 点击:2398次 字体:[ ]




Android API Demos中有很多非常Nice的例子,这些例子的代码都写的很出色,如果大家把API Demos中的每个例子研究透了,那么恭喜你已经成为一个真正的Android高手了。这也算是给一些比较迷茫的Android开发者一个指出了一个提升自我能力的方向吧。API Demos中的例子众多,今天我们就来模仿其中一个3D变换的特效,来实现一种别样的图片浏览器。

既然是做中轴旋转的特效,那么肯定就要用到3D变换的功能。在Android中如果想要实现3D效果一般有两种选择,一是使用Open GL ES,二是使用Camera。Open GL ES使用起来太过复杂,一般是用于比较高级的3D特效或游戏,像比较简单的一些3D效果,使用Camera就足够了。
 

Camera中提供了三种旋转方法,分别是rotateX()、rotateY()和rotateZ,调用这三个方法,并传入相应的角度,就可以让视图围绕这三个轴进行旋转,而今天我们要做的中轴旋转效果其实就是让视图围绕Y轴进行旋转。使用Camera让视图进行旋转的示意图,如下所示:

                                  Android实现中轴旋转特效的图片浏览器_www.fengfly.com
 

那我们就开始动手吧,首先创建一个Android项目,起名叫做RotatePicBrowserDemo,然后我们准备了几张图片,用于稍后在图片浏览器中进行浏览。

而API Demos中已经给我们提供了一个非常好用的3D旋转动画的工具类Rotate3dAnimation,这个工具类就是使用Camera来实现的,我们先将这个这个类复制到项目中来,代码如下所示:

  1. /**  
  2.  * An animation that rotates the view on the Y axis between two specified angles.  
  3.  * This animation also adds a translation on the Z axis (depth) to improve the effect.  
  4.  */ 
  5. public class Rotate3dAnimation extends Animation {  
  6.     private final float mFromDegrees;  
  7.     private final float mToDegrees;  
  8.     private final float mCenterX;  
  9.     private final float mCenterY;  
  10.     private final float mDepthZ;  
  11.     private final boolean mReverse;  
  12.     private Camera mCamera;  
  13.  
  14.     /**  
  15.      * Creates a new 3D rotation on the Y axis. The rotation is defined by its  
  16.      * start angle and its end angle. Both angles are in degrees. The rotation  
  17.      * is performed around a center point on the 2D space, definied by a pair  
  18.      * of X and Y coordinates, called centerX and centerY. When the animation  
  19.      * starts, a translation on the Z axis (depth) is performed. The length  
  20.      * of the translation can be specified, as well as whether the translation  
  21.      * should be reversed in time.  
  22.      *  
  23.      * @param fromDegrees the start angle of the 3D rotation  
  24.      * @param toDegrees the end angle of the 3D rotation  
  25.      * @param centerX the X center of the 3D rotation  
  26.      * @param centerY the Y center of the 3D rotation  
  27.      * @param reverse true if the translation should be reversed, false otherwise  
  28.      */ 
  29.     public Rotate3dAnimation(float fromDegrees, float toDegrees,  
  30.             float centerX, float centerY, float depthZ, boolean reverse) {  
  31.         mFromDegrees = fromDegrees;  
  32.         mToDegrees = toDegrees;  
  33.         mCenterX = centerX;  
  34.         mCenterY = centerY;  
  35.         mDepthZ = depthZ;  
  36.         mReverse = reverse;  
  37.     }  
  38.  
  39.     @Override 
  40.     public void initialize(int width, int height, int parentWidth, int parentHeight) {  
  41.         super.initialize(width, height, parentWidth, parentHeight);  
  42.         mCamera = new Camera();  
  43.     }  
  44.  
  45.     @Override 
  46.     protected void applyTransformation(float interpolatedTime, Transformation t) {  
  47.         final float fromDegrees = mFromDegrees;  
  48.         float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);  
  49.  
  50.         final float centerX = mCenterX;  
  51.         final float centerY = mCenterY;  
  52.         final Camera camera = mCamera;  
  53.  
  54.         final Matrix matrix = t.getMatrix();  
  55.  
  56.         camera.save();  
  57.         if (mReverse) {  
  58.             camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);  
  59.         } else {  
  60.             camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));  
  61.         }  
  62.         camera.rotateY(degrees);  
  63.         camera.getMatrix(matrix);  
  64.         camera.restore();  
  65.  
  66.         matrix.preTranslate(-centerX, -centerY);  
  67.         matrix.postTranslate(centerX, centerY);  
  68.     }  
  69. }  

可以看到,这个类的构造函数中接收一些3D旋转时所需用到的参数,比如旋转开始和结束的角度,旋转的中心点等。然后重点看下applyTransformation()方法,首先根据动画播放的时间来计算出当前旋转的角度,然后让Camera也根据动画播放的时间在Z轴进行一定的偏移,使视图有远离视角的感觉。接着调用Camera的rotateY()方法,让视图围绕Y轴进行旋转,从而产生立体旋转的效果。最后通过Matrix来确定旋转的中心点的位置。

有了这个工具类之后,我们就可以借助它非常简单地实现中轴旋转的特效了。接着创建一个图片的实体类Picture,代码如下所示:

  1. public class Picture {  
  2.  
  3.     /**  
  4.      * 图片名称  
  5.      */ 
  6.     private String name;  
  7.  
  8.     /**  
  9.      * 图片对象的资源  
  10.      */ 
  11.     private int resource;  
  12.  
  13.     public Picture(String name, int resource) {  
  14.         this.name = name;  
  15.         this.resource = resource;  
  16.     }  
  17.  
  18.     public String getName() {  
  19.         return name;  
  20.     }  
  21.  
  22.     public int getResource() {  
  23.         return resource;  
  24.     }  
  25.  
  26. }  

这个类中只有两个字段,name用于显示图片的名称,resource用于表示图片对应的资源。
 



本文地址 : http://www.fengfly.com/plus/view-215100-1.html
标签: Android 图片浏览器 中轴旋转
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:
本栏分类