Android 动画总结

作者: Zcclucky | 来源:发表于2015-12-31 17:32 被阅读498次

    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

    相关文章

      网友评论

        本文标题:Android 动画总结

        本文链接:https://www.haomeiwen.com/subject/bxtwhttx.html