找回密码
 注册
搜索
查看: 712|回复: 1

[讨论] Rexsee API介绍:Animations动画学习笔记及源码

[复制链接]
发表于 2011-12-21 19:01:54 | 显示全部楼层 |阅读模式
在Android上实现动画,官方的SDK提供了Animations,并且介绍了两种不同模式,分别是:
1. Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画;
2. Frame Animation:顺序播放事先做好的图像,是一种画面转换动画。

同时,Animation由四种类型组成:
XML文件:
· alpha        渐变透明度动画效果
· scale        渐变尺寸伸缩动画效果
· translate    画面转换位置移动动画效果
· rotate       画面转移旋转动画效果
在Java 源码中定义了相应的类,可以使用这些类的方法来获取和操作相应的属性:
· AlphaAnimation     渐变透明度动画效果
· ScaleAnimation     渐变尺寸伸缩动画效果
· TranslateAnimation 画面转换位置移动动画效果
· RotateAnimation    画面转移旋转动画效果

具体Android的原生就不再多说了,相对复杂,有兴趣的可以直接去看google的SDK。这里分享了Rexsee的API,基于对原生的封装,可以直接使用JS实现功能调用。如:
【事件】        void onAnimationStart(String id)
【说明】        当动画开始播放时触发。

在Rexsee社区可以直接查看源码。同时,新上线的项目中心提供了在线开发服务,不需要单独准备服务器。同时也有大量的应用以分享的方式开放供查阅,关于动画的具体应用源码也可以在这里查到:http://www.rexsee.com/project/

Rexsee API:Animations源码
package rexsee.core.animation;  

import rexsee.core.style.StyleSheet;  
import rexsee.core.utilities.RexseeUtilities;  
import android.view.View;  
import android.view.animation.AccelerateDecelerateInterpolator;  
import android.view.animation.AccelerateInterpolator;  
import android.view.animation.AlphaAnimation;  
import android.view.animation.Animation;  
import android.view.animation.AnimationSet;  
import android.view.animation.AnticipateInterpolator;  
import android.view.animation.AnticipateOvershootInterpolator;  
import android.view.animation.BounceInterpolator;  
import android.view.animation.CycleInterpolator;  
import android.view.animation.DecelerateInterpolator;  
import android.view.animation.Interpolator;  
import android.view.animation.LinearInterpolator;  
import android.view.animation.OvershootInterpolator;  
import android.view.animation.RotateAnimation;  
import android.view.animation.ScaleAnimation;  
import android.view.animation.TranslateAnimation;  

public class Animations extends Animation {  

       public Animations() {  
               super();  
       }  

       public static Animation getAnimation(StyleSheet style, AnimationListener listener, View view, View viewParent) {  
               if (view == null) return null;  
               if (viewParent == null) {  
                       try {  
                               viewParent = (View) view.getParent();  
                       } catch (Exception e) {  
                               viewParent = view;  
                       }  
               }  
               AnimationSet animation = new AnimationSet(true);  
               String[] types = style.animation_type.split("\\+");  
               int length = 0;  
               for (int i = 0; i < types.length; i++) {  
                       Animation a;  
                       if (types.equalsIgnoreCase("skew")) {  
                               a = getSkewAnimation(style, view, viewParent);  
                       } else if (types.equalsIgnoreCase("rotate_3dy")) {  
                               a = getRotate3dyAnimation(style, view, viewParent);  
                       } else if (types.equalsIgnoreCase("rotate_3dx")) {  
                               a = getRotate3dxAnimation(style, view, viewParent);  
                       } else if (types.equalsIgnoreCase("rotate")) {  
                               a = getRotateAnimation(style, view, viewParent);  
                       } else if (types.equalsIgnoreCase("alpha")) {  
                               a = getAlphaAnimation(style, view, viewParent);  
                       } else if (types.equalsIgnoreCase("scale")) {  
                               a = getScaleAnimation(style, view, viewParent);  
                       } else if (types.equalsIgnoreCase("translate")) {  
                               a = getTranslateAnimation(style, view, viewParent);  
                       } else {  
                               a = null;  
                       }  
                       if (a != null) {  
                               animation.addAnimation(a);  
                               length++;  
                       }  
               }  
               if (length == 0) return null;  
               try {  
                       if (listener != null) animation.setAnimationListener(listener);  
               } catch (Exception e) {  
               }  
               return animation;  
       }  

       public static Animation getRotateAnimation(StyleSheet style, View view, View viewParent) {  
               Animation animation = null;  
               try {  
                       float rotateCenterX, rotateCenterY;  
                       try {  
                               rotateCenterX = Float.parseFloat(style.animation_rotate_center_x.replaceAll("%", ""));  
                               rotateCenterX = rotateCenterX / 100;  
                               if (rotateCenterX < 0) rotateCenterX = 0;  
                               if (rotateCenterX > 1) rotateCenterX = 1;  
                       } catch (Exception e) {  
                               rotateCenterX = (float) 0.5;  
                       }  
                       try {  
                               rotateCenterY = Float.parseFloat(style.animation_rotate_center_y.replaceAll("%", ""));  
                               rotateCenterY = rotateCenterY / 100;  
                               if (rotateCenterY < 0) rotateCenterY = 0;  
                               if (rotateCenterY > 1) rotateCenterY = 1;  
                       } catch (Exception e) {  
                               rotateCenterY = (float) 0.5;  
                       }  
                       int from = Integer.parseInt(style.animation_rotate_from);  
                       int to = Integer.parseInt(style.animation_rotate_to);  
                       animation = new RotateAnimation(from, to, Animation.RELATIVE_TO_PARENT, rotateCenterX, Animation.RELATIVE_TO_PARENT, rotateCenterY);  
                       animation.setDuration(Integer.parseInt(style.animation_rotate_duration));  
                       animation.setRepeatCount(Integer.parseInt(style.animation_rotate_repeat_count));  
                       animation.setRepeatMode(style.animation_rotate_repeat_mode.equalsIgnoreCase("normal") ? 1 : 2);  
                       animation.setStartOffset(RexseeUtilities.getLong(style.animation_rotate_start_time, 0));  
                       animation.setInterpolator(getInterPolator(style.animation_rotate_interpolator));  
                       animation.initialize(view.getWidth(), view.getHeight(), viewParent.getWidth(), viewParent.getHeight());  
               } catch (Exception e) {  
               }  
               return animation;  
       }  
       public static Animation getAlphaAnimation(StyleSheet style, View view, View viewParent) {  
               Animation animation = null;  
               try {  
                       float from = Float.parseFloat(style.animation_alpha_from.replaceAll("%", "")) / 100;  
                       float to = Float.parseFloat(style.animation_alpha_to.replaceAll("%", "")) / 100;  
                       animation = new AlphaAnimation(from, to);  
                       animation.setDuration(Integer.parseInt(style.animation_alpha_duration));  
                       animation.setRepeatCount(Integer.parseInt(style.animation_alpha_repeat_count));  
                       animation.setRepeatMode(style.animation_alpha_repeat_mode.equalsIgnoreCase("normal") ? 1 : 2);  
                       animation.setStartOffset(RexseeUtilities.getLong(style.animation_alpha_start_time, 0));  
                       animation.setInterpolator(getInterPolator(style.animation_alpha_interpolator));  
                       animation.initialize(view.getWidth(), view.getHeight(), viewParent.getWidth(), viewParent.getHeight());  
               } catch (Exception e) {  
               }  
               return animation;  
       }  
       public static Animation getScaleAnimation(StyleSheet style, View view, View viewParent) {  
               Animation animation = null;  
               try {  
                       float scaleCenterX, scaleCenterY;  
                       try {  
                               scaleCenterX = Float.parseFloat(style.animation_scale_center_x.replaceAll("%", ""));  
                               scaleCenterX = scaleCenterX / 100;  
                               if (scaleCenterX < 0) scaleCenterX = 0;  
                               if (scaleCenterX > 1) scaleCenterX = 1;  
                       } catch (Exception e) {  
                               scaleCenterX = (float) 0.5;  
                       }  
                       try {  
                               scaleCenterY = Float.parseFloat(style.animation_scale_center_y.replaceAll("%", ""));  
                               scaleCenterY = scaleCenterY / 100;  
                               if (scaleCenterY < 0) scaleCenterY = 0;  
                               if (scaleCenterY > 1) scaleCenterY = 1;  
                       } catch (Exception e) {  
                               scaleCenterY = (float) 0.5;  
                       }  
                       float fromX = Float.parseFloat(style.animation_scale_x_from);  
                       float toX = Float.parseFloat(style.animation_scale_x_to);  
                       float fromY = Float.parseFloat(style.animation_scale_y_from);  
                       float toY = Float.parseFloat(style.animation_scale_y_to);  
                       animation = new ScaleAnimation(fromX, toX, fromY, toY, Animation.RELATIVE_TO_PARENT, scaleCenterX, Animation.RELATIVE_TO_PARENT, scaleCenterY);  
                       animation.setInterpolator(getInterPolator(style.animation_scale_interpolator));  
                       animation.initialize(view.getWidth(), view.getHeight(), viewParent.getWidth(), viewParent.getHeight());  
               } catch (Exception e) {  
               }  
               return animation;  
       }  
       public static Animation getTranslateAnimation(StyleSheet style, View view, View viewParent) {  
               Animation animation = null;  
                       toX = toX / 100;  
                       fromY = fromY / 100;  
                       toY = toY / 100;  
                       animation = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, fromX, Animation.RELATIVE_TO_PARENT, toX, Animation.RELATIVE_TO_PARENT, fromY, Animation.RELATIVE_TO_PARENT, toY);  
                       animation.setDuration(Integer.parseInt(style.animation_translate_duration));  
                       animation.setRepeatCount(Integer.parseInt(style.animation_translate_repeat_count));  
                       animation.setRepeatMode(style.animation_translate_repeat_               return animation;  
       }  

       public static Animation getRotate3dyAnimation(StyleSheet style, View view, View viewParent) {  
               Animation animation = null;  
               try {  
                       float rotate3DCenterX, rotate3DCenterY;  
                       try {  
                               rotate3DCenterX = Float.parseFloat(style.animation_rotate_3dy_center_x.replaceAll("%", ""));  
                               rotate3DCenterX = rotate3DCenterX / 100;  
                               if (rotate3DCenterX < 0) rotate3DCenterX = 0;  
                               if (rotate3DCenterX > 1) rotate3DCenterX = 1;  
                       } catch (Exception e) {  
                               rotate3DCenterX = (float) 0.5;  
                       }  
                       }  
                       rotate3DCenterY = view.getHeight() * rotate3DCenterY;  
                       float from = RexseeUtilities.getFloat(style.animation_rotate_3dy_from, 0f);  
                       float to = RexseeUtilities.getFloat(style.animation_rotate_3dy_to, 90f);  
                       float rotate3DDepthZ = RexseeUtilities.getFloat(style.animation_rotate_3dy_depth_z, 310.0f);  
                       boolean reverse = (style.animation_rotate_3dy_reverse.equalsIgnoreCase("true")) ? true : false;  
                       animation = new Rotate3dyAnimation(from, to, rotate3DCenterX, rotate3DCenterY, rotate3DDepthZ, reverse);  
                       animation.setDuration(RexseeUtilities.getInt(style.animation_rotate_3dy_duration, 1000));  
                       animation.setRepeatCount(RexseeUtilities.getInt(style.animation_rotate_3dy_repeat_count, 0));  
                       animation.setRepeatMode(style.animation_rotate_3dy_repeat_mode.equalsIgnoreCase("normal") ? 1 : 2);  
               return animation;  
       }  

       public static Animation getRotate3dxAnimation(StyleSheet style, View view, View viewParent) {  
               Animation animation = null;  
               try {  
                       float rotate3DCenterX, rotate3DCenterY;  
                       try {  
                               rotate3DCenterX = Float.parseFloat(style.animation_rotate_3dx_center_x.replaceAll("%", ""));  
                               rotate3DCenterX = rotate3DCenterX / 100;  
;  
                       try {  
                               rotate3DCenterY = Float.parseFloat(style.animation_rotate_3dx_center_y.replaceAll("%", ""));  
                               rotate3DCenterY = rotate3DCenterY / 100;  
                               if (rotate3DCenterY < 0) rotate3DCenterY = 0;  
                               if (rotate3DCenterY > 1) rotate3DCenterY = 1;  
                       } catch (Exception e) {  
                               rotate3DCenterY = (float) 0.5;  
                       }  
                       rotate3DCenterY = view.getHeight() * rotate3DCenterY;  
                       float from = RexseeUtilities.getFloat(style.animation_rotate_3dx_from, 0f);  
                       float to = RexseeUtilities.getFloat(style.animation_rotate_3dx_to, 90f);  
                       float rotate3DDepthZ = RexseeUtilities.getFloat(style.animation_rotate_3dx_depth_z, 310.0f);  
                       boolean reverse = (style.animation_rotate_3dx_reverse.equalsIgnoreCase("true")) ? true : false;  
                       animation = new Rotate3dxAnimation(from, to, rotate3DCenterX, rotate3DCenterY, rotate3DDepthZ, reverse);  
                       animation.setDuration(RexseeUtilities.getInt(style.animation_rotate_3dx_duration, 1000));  
                       animation.setRepeatCount(RexseeUtilities.getInt(style.animation_rotate_3dx_repeat_count, 0));  
               } catch (Exception e) {  
               }  
               return animation;  
       }  
       public static Animation getSkewAnimation(StyleSheet style, View view, View viewParent) {  
               Animation animation = null;  
               try {  
                       float skewCenterX, skewCenterY;  
                       try {  
                               skewCenterX = Float.parseFloat(style.animation_skew_center_x.replaceAll("%", ""));  
                               skewCenterX = skewCenterX / 100;  
                               if (skewCenterX < 0) skewCenterX = 0;  
                               if (skewCenterX > 1) skewCenterX = 1;  
                       } catch (Exception e) {  
                               skewCenterX = (float) 0.5;  
                       }  
                       skewCenterX = view.getWidth() * skewCenterX;  
                       try {  
                               skewCenterY = Float.parseFloat(style.animation_skew_center_y.replaceAll("%", ""));  
                               skewCenterY = skewCenterY / 100;  
                               if (skewCenterY < 0) skewCenterY = 0;  
                               if (skewCenterY > 1) skewCenterY = 1;  
                       } catch (Exception e) {  
                               skewCenterY = (float) 0.5;  
                       }  
                       skewCenterY = view.getHeight() * skewCenterY;  
                       float skewDepthZ = RexseeUtilities.getFloat(style.animation_skew_depth_z, 310.0f);  
                       boolean reverse = (style.animation_skew_reverse.equalsIgnoreCase("true")) ? true : false;  
                       animation = new SkewAnimation(fromX, toX, fromY, toY, skewCenterX, skewCenterY, skewDepthZ, reverse);  
                       animation.setDuration(RexseeUtilities.getInt(style.animation_skew_duration, 1000));  
                       animation.setRepeatCount(RexseeUtilities.getInt(style.animation_skew_repeat_count, 0));  
                       animation.setRepeatMode(style.animation_skew_repeat_mode.equalsIgnoreCase("normal") ? 1 : 2);  
                       animation.setStartOffset(RexseeUtilities.getLong(style.animation_skew_start_time, 0));  
                       animation.setInterpolator(getInterPolator(style.animation_skew_interpolator));  
                       animation.initialize(view.getWidth(), view.getHeight(), viewParent.getWidth(), viewParent.getHeight());  

               } catch (Exception e) {  
               }  
               return animation;  
       }  
       public static Interpolator getInterPolator(String name) {  
               if (name.equalsIgnoreCase("AccelerateDecelerate")) {  
                       return new AccelerateDecelerateInterpolator();  
               } else if (name.equalsIgnoreCase("AnticipateOvershoot")) {  
                       return new AnticipateOvershootInterpolator(1.0f, 1.5f);  
               } else if (name.equalsIgnoreCase("Overshoot")) {  
                       return new OvershootInterpolator(1.0f);  
               } else if (name.equalsIgnoreCase("Bounce")) {  
                       return new BounceInterpolator();  
               } else if (name.equalsIgnoreCase("Cycle")) {  
                       return new CycleInterpolator(1);  
               } else if (name.equalsIgnoreCase("Linear")) {  
                       return new LinearInterpolator();  
               } else {  
                       return new LinearInterpolator();  
               }  
       }  

}
发表于 2011-12-21 20:57:52 | 显示全部楼层
能不能对源码做一个注释啊?太长了,看不下去。。
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-23 12:02 , Processed in 0.057224 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表