Android 动画总结

1. 帧动画

通过资源文件引入每一帧的图片和时长,然后播放达到效果。xml 分类为 animation-list,drawable 的一种。

  
 
   
    
   
    
   
   
 
xml 属性解析:
  item 为图片资源和时长。
  oneshot 是否为单次 true 只播放一次, false 循环播放

在Activity里面通过AnimationDrawable使用。

 ImageView img=(ImageView)findViewById(R.id.spinning_wheel_image);
 img.setBackgroundResource(R.drawable.spin_animation);
 // Get the background, which has been compiled to an AnimationDrawable object.
 AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground(); 
// Start the animation (looped playback by default). frameAnimation.start();

例子是以imageview的background为载体,也可以直接写在imageview 的source中,获取并操作:

   
ImageView img=(ImageView)findViewById(R.id.spinning_wheel_image);
AnimationDrawable frameAnimation = (AnimationDrawable) img.getDrawable(); 
frameAnimation.start();

2. AnimationObject

属性动画,谷歌在新版api中添加的动画类型。其本质是通过插值器改变对应的view 的相关属性,而达到动画的目的。其主要的使用类有以下两种:

ValueAnimator

接口暴露最完备的一个类。可以完整地通过变化中的插值来改变动画的状态。如:

public static ValueAnimator getAnim (final View target, final int start, final int end, final int duration){
     final int steps =duration /10;
    ValueAnimator vA  = ValueAnimator.ofInt(1,steps);
    vA.addUpdateListener(new ValueAnimator.AnimationUpdateListener(){
        private IntEvaluator mEvaluator = IntEvaluator();
      
       @Override
        public void onAnimationUpdate(Valuanimator animator){
            int currentValue = (Integer) animator.getAnimationValue();
            float fraction = currentValue / ((float)steps);
            target.getLayoutParams().height =mEvaluator.evaluate(fraction, start, end);
            target.requestLayout();
        }
    });
    vA.setDuration(duration);
    return vA;
}

ObjectAnimator

最常见的调用方法如下

ObjectAnimator animator = ObjectAnimator.ofFloat(EditDraftView.this, "translationX", 0, -ScreenTools.instance().dip2px(180f));
animator.setInterpolator(new LinearInterpolator());
animator.setDuration(700);animator.start();

其实也是封装了一个插值器。因此,在传入的第二个参数意味着,改target 必须有 getXXX这样的方法,setXXX方便系统调用并设置。方法的好处在于简单易用。对于没有对应的XXX的方法的类,可以设置一个包裹类,提供对应方法。

TranslateAnimation

继承自系统的Animation。与之类似的子类还有
AlphaAnimation, AnimationSet, RotateAnimation, ScaleAnimation, TranslateAnimation
特点是使用简易,然而自定义程度较低。直接通过View 设置
范例

public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
Added in [API level 1]

Constructor to use when building a TranslateAnimation from code

Parameters
fromXDelta
Change in X coordinate to apply at the start of the animation

toXDelta
Change in X coordinate to apply at the end of the animation

fromYDelta
Change in Y coordinate to apply at the start of the animation

toYDelta
Change in Y coordinate to apply at the end of the animation
translateAnimation.setDuration(3000);               //设置动画持续时间  
translateAnimation.setRepeatCount(2);               //设置重复次数  
translateAnimation.setRepeatMode(Animation.REVERSE);    //反方向执行  
image.setAnimation(translateAnimation);             //设置动画效果  
translateAnimation.startNow();   

再补充一种Animation的使用方式

首先定义XML

    
    
    

其中描述的是对应动画的变化方式,这种xml 的定义方式具备一定的局限性,无法完成复杂的动画模式,原理跟上一种一样

然后使用

Animation animation =  
    AnimationUtils.loadAnimation(getContext(), 
        R.anim.u_biz_anim_publish_breathing);         
ImageView mPublishCamAnim = xxx;
mPublishCamAnim.startAnimation(animation);

这里注意,直接使用animation.start的方法是不可靠的,因为view 对象需要对动画进行validate。所以需要用view 对象的start animation

你可能感兴趣的:(Android 动画总结)