Android技术知识

Android 动画总结

2015-12-31  本文已影响498人  Zcclucky

1. 帧动画

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

 <!-- Animation frames are wheel0.png through wheel5.png     
files inside the res/drawable/ folder --> 
<animation-list android:id="@+id/selected" 
                android:oneshot="false"> 
   <item android:drawable="@drawable/wheel0" android:duration="50" />
   <item android:drawable="@drawable/wheel1" android:duration="50" /> 
   <item android:drawable="@drawable/wheel2" android:duration="50" />
   <item android:drawable="@drawable/wheel3" android:duration="50" /> 
   <item android:drawable="@drawable/wheel4" android:duration="50" />
   <item android:drawable="@drawable/wheel5" android:duration="50" />
 </animation-list>
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
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:src="@drawable/spin_animation"
      android:id="@+id/spinning_wheel_image"/>
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

    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:fillAfter="true"
        android:fillBefore="false">
    <alpha        
        android:duration="1500"
        android:fromAlpha="1" 
        android:repeatCount="5" 
        android:repeatMode="restart"
        android:toAlpha="0.01" />
    <scale        
        android:duration="1500"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="5" 
        android:repeatMode="restart"
        android:toXScale="2.2"
        android:toYScale="2.2" />
</set>

其中描述的是对应动画的变化方式,这种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

上一篇下一篇

猜你喜欢

热点阅读