美文网首页
Android 动画

Android 动画

作者: 荞麦穗 | 来源:发表于2017-10-27 15:38 被阅读0次

    android动画分为三种 帧动画,视图动画(补间动画),属性动画
    逐帧动画

    image.setBackgroundResource(R.anim.anim_frame);
    AnimationDrawable anim = (AnimationDrawable) image.getBackground();
    anim.start();
    

    视图动画

            view = new ImageView(context);
            //四种视图动画,透明度,旋转,平移,缩放
            AlphaAnimation      animation0 = new AlphaAnimation(0,1);//(float fromAlpha, float toAlpha)
            RotateAnimation     animation1 = new RotateAnimation(0,360,100,100);//(float fromDegrees, float toDegrees)
            TranslateAnimation  animation2 = new TranslateAnimation(0,200,0,300);//(float fromXDelta, float toXDelta,float fromYDelta, float toYDelta)
            ScaleAnimation      animation3 = new ScaleAnimation(0,2,0,2);//(float fromX, float toX, float fromY, float toY)
            animation0.setDuration(1000);
            view.startAnimation(animation0);
            //动画集合
            AnimationSet animationSet = new AnimationSet(true);//(boolean shareInterpolator)是否共用一个插值器
            animationSet.addAnimation(animation0);
            animationSet.setDuration(1000);
            animationSet.addAnimation(animation1);
            animationSet.addAnimation(animation3);
            animationSet.addAnimation(animation3);
            view.startAnimation(animationSet);
    
            animationSet.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {
                }
                @Override
                public void onAnimationEnd(Animation animation) {
                }
                @Override
                public void onAnimationRepeat(Animation animation) {
                }
            });
    

    属性动画

     /**
             * ObjectAnimator只能控制一个属性,要操纵的属性必须有set,get方法
             * 常用属性
             * translationX,translationY
             * rotation,rotationX,rotationY
             * scaleX,scaleY
             * pivotX,pivotY
             * alpha
             * x,y
             */
            ObjectAnimator objectAnimator =ObjectAnimator.ofFloat(view,"translationX",300);
            objectAnimator.setDuration(1000);
            objectAnimator.start();
            /**
             * 如果没有属性,可以通过ValueAnimator或者使用包装类ViewWrapper
             * public final class ObjectAnimator extends ValueAnimator
             */
            ValueAnimator valueAnimator = ValueAnimator.ofFloat(0,100);
            valueAnimator.setDuration(1000);
            valueAnimator.setTarget(view);
            valueAnimator.start();
            valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator valueAnimator) {
    
                }
            });
    
            /**
             * 属性动画集合
             * playSequentially();
             * play().after().with().before()
             */
            AnimatorSet animatorSet = new AnimatorSet();
            animatorSet.playTogether(objectAnimator,valueAnimator);
            animatorSet.start();
    

    Window和Activity切换动画

    <style name="window">
      <item name="android:windowEnterAnimation">@anim/slide_left_enter</item>
      <item name="android:windowExitAnimation">@anim/slide_right_exit</item>
    </style>
    style的id传给WindowManager.LayoutParams.windowAnimation或者构造函数
    
    <style name="activity" >
          <item name="android:activityOpenEnterAnimation">@android:anim/slide_in_left</item>
          <item name="android:activityOpenExitAnimation">@android:anim/slide_out_right</item>
          <item name="android:activityCloseEnterAnimation">@anim/push_right_in</item>
          <item name="android:activityCloseExitAnimation">@anim/push_left_out</item>
    </style>
    
    <style name="mytheme" parent="@android:style/Theme"> 
          <item name="@android:windowAnimationStyle">@style/activity </item>
    </style>
    

    XML中定义动画
    补间动画 res/anim文件夹下 帧动画 res/drawable文件夹

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <alpha 
            android:duration="500"
            android:fromAlpha="1.0"
            android:toAlpha="0.0" />
        <scale
            android:duration="10000"
            android:fromXScale="0.0"
            android:fromYScale="0.0"
            android:interpolator="@android:anim/decelerate_interpolator"
            android:pivotX="50%"
            android:pivotY="50%"
            android:repeatCount="1"
            android:repeatMode="reverse"
            android:startOffset="0"
            android:toXScale="1.5"
            android:toYScale="1.5" />
        <translate
            android:duration="10000"
            android:fromXDelta="320"
            android:fromYDelta="480"
            android:toXDelta="0"
            android:toYDelta="0" />
        <rotate
            android:duration="10000"
            android:fromDegrees="300"
            android:interpolator="@android:anim/accelerate_decelerate_interpolator"
            android:pivotX="10%"
            android:pivotY="100%"
            android:toDegrees="-360" />
    </set>
    

    透明:

    android:fillAfter       如果设置为true,控件动画结束时,将保持动画最后时的状态
    android:fillBefore      如果设置为true,控件动画结束时,还原到开始动画前的状态
    android:fillEnabled     与android:fillBefore 效果相同,都是在动画结束时,将控件还原到初始化状态
    android:repeatCount     重复次数
    android:repeatMode      重复类型,有reverse和restart两个值,reverse表示倒序回放,restart表示重新放一遍,必须与repeatCount一起使用才能看到效果。
    android:interpolator    设定插值器
    android:startOffset     动画多次执行的间隔时间,如果只执行一次,执行前会暂停这段时间,单位毫秒 duration,一次动画效果消耗的时间,单位毫秒,值越小动画速度越快 
    android:pivotX          属性为动画相对于物件的X坐标的开始位置
    android:toXDelta        动画结束时X,Y的座标       
    
    

    属性动画:
    <animator>、<objectAnimator>、<set>

    android:duration 动画从开始到结束持续的时长,单位为毫秒
    android:startOffset 设置动画执行之前的等待时长,单位为毫秒
    android:repeatCount 设置动画重复执行的次数,默认为0,即不重复;可设为-1或infinite,表示无限重复
    android:repeatMode 设置动画重复执行的模式,可设为以下两个值其中之一:
    restart 动画重复执行时从起点开始,默认为该值
    reverse 动画会反方向执行
    android:valueFrom 动画开始的值,可以为int值、float值或color值
    android:valueTo 动画结束的值,可以为int值、float值或color值
    android:valueType 动画值类型,若为color值,则无需设置该属性
    intType 指定动画值,即以上两个value属性的值为整型
    floatType 指定动画值,即以上两个value属性的值为浮点型,默认值
    android:interpolator 设置动画速率的变化,比如加速、减速、匀速等,需要指定Interpolator资源。
    
    <animator xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="3000"
        android:valueFrom="100"
        android:valueTo="20"
        android:valueType="intType" />
    
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:ordering="together">
        <objectAnimator
            android:duration="3000"
            android:propertyName="width"
            android:valueFrom="100"
            android:valueTo="20"
            android:valueType="intType" />
        <objectAnimator
            android:duration="3000"
            android:propertyName="marginTop"
            android:valueFrom="0"
            android:valueTo="100"
            android:valueType="intType" />
    </set>
    

    当属性动画没有get和set方法是,提要提供一个包装类来设置

    
        private void performAnimate() {
            ViewWrapper wrapper = new ViewWrapper(mButton);
            ObjectAnimator.ofInt(wrapper, "width", 500).setDuration(5000).start();
        }
     
        @Override
        public void onClick(View v) {
            if (v == mButton) {
                performAnimate();
            }
        }
     
        private static class ViewWrapper {
            private View mTarget;
     
            public ViewWrapper(View target) {
                mTarget = target;
            }
     
            public int getWidth() {
                return mTarget.getLayoutParams().width;
            }
     
            public void setWidth(int width) {
                mTarget.getLayoutParams().width = width;
                mTarget.requestLayout();
            }
        }
    

    相关文章

      网友评论

          本文标题:Android 动画

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