美文网首页
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