柚子快报邀请码778899分享:Android之 动画总结

http://www.51969.com/

一 动画种类

1.1 动画在Android中运用也非常广泛,如点击按钮,加载框,Activity的转场等都有动画的身影

1.2 常用的动画有以下以下几种

逐帧动画【Frame Animation】,即顺序播放事先准备的图片

补间动画【Tween Animation】,View的动画效果可以实现简单的平移、缩放、旋转。

属性动画【Property Animation】,补间动画增强版,支持对对象执行动画。

过渡动画【Transition Animation】,实现Activity或View过渡动画效果。包括5.0之后的MD过渡动画等。

二 逐帧动画 

2.1 定义一个动画xml,设置图片集合

xmlns:android="http://schemas.android.com/apk/res/android">

2.2 java设置动画

//定义组件

ImageVIew ivImage = findViewById(R.id.iv_refresh_header);

//开始动画

ivImage.setImageResource(R.drawable.anim_loading);

mAnimationDrawable = (AnimationDrawable) ivImage.getDrawable();

mAnimationDrawable.start();

//停止动画

ivImage.clearAnimation();

if (mAnimationDrawable != null){

mAnimationDrawable.stop();

}

三 补间动画

2.1 补间动画种类

透明度变化,大小缩放变化,位移变化,旋转变化

2.2 透明度动画,两种定义方式

xml定义

android:duration="1000"

android:fromAlpha="0.0"

android:toAlpha="1.0" />

java定义

AlphaAnimation alpha = new AlphaAnimation(0, 1);

alpha.setDuration(500); //设置持续时间

alpha.setFillAfter(true); //动画结束后保留结束状态

alpha.setInterpolator(new AccelerateInterpolator()); //添加差值器

ivImage.setAnimation(alpha);

2.3 大小缩放动画,两种定义方式

xml定义

android:duration="1000"

android:fillAfter="false"

android:fromXScale="0.0"

android:fromYScale="0.0"

android:interpolator="@android:anim/accelerate_decelerate_interpolator"

android:pivotX="50%"

android:pivotY="50%"

android:toXScale="1.4"

android:toYScale="1.4" />

java定义

ScaleAnimation scale = new ScaleAnimation(1.0f, scaleXY, 1.0f, scaleXY, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

scale.setDuration(durationMillis);

scale.setFillAfter(true);

ivImage.setAnimation(scale);

2.4 位移动画,两种定义方式

xml定义

android:duration="2000"

android:fromXDelta="30"

android:fromYDelta="30"

android:toXDelta="-80"

android:toYDelta="300" />

Java定义

TranslateAnimation translate = new TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);

translate.setDuration(durationMillis);

translate.setFillAfter(true);

ivImage.setAnimation(translate);

2.5 旋转动画,两种定义方式

xml定义

android:duration="3000"

android:fromDegrees="0"

android:interpolator="@android:anim/accelerate_decelerate_interpolator"

android:pivotX="50%"

android:pivotY="50%"

android:toDegrees="+350" />

java定义

RotateAnimation rotate = new RotateAnimation(fromDegrees, toDegrees, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

rotate.setDuration(durationMillis);

rotate.setFillAfter(true);

ivImage.setAnimation(rotate);

2.6 组合动画AnimationSet

RelativeLayout rlRoot = (RelativeLayout) findViewById(R.id.rl_root);

//旋转动画

RotateAnimation animRotate = new RotateAnimation(0, 360,

Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,

0.5f);

animRotate.setDuration(1000);// 动画时间

animRotate.setFillAfter(true);// 保持动画结束状态

//缩放动画

ScaleAnimation animScale = new ScaleAnimation(0, 1, 0, 1,

Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,0.5f);

animScale.setDuration(1000);

animScale.setFillAfter(true);// 保持动画结束状态

//渐变动画

AlphaAnimation animAlpha = new AlphaAnimation(0, 1);

animAlpha.setDuration(2000);// 动画时间

animAlpha.setFillAfter(true);// 保持动画结束状态

//动画集合

AnimationSet set = new AnimationSet(true);

set.addAnimation(animRotate);

set.addAnimation(animScale);

set.addAnimation(animAlpha);

//启动动画

rlRoot.startAnimation(set);

三 属性动画

3.1 xml+java调用方式

定义animator.xml

android:valueFrom="0"

android:valueTo="100"

android:valueType="intType"

android:duration="3000"

android:startOffset ="1000"

android:fillBefore = "true"

android:fillAfter = "false"

android:fillEnabled= "true"

android:repeatMode= "restart"

android:repeatCount = "0"

android:interpolator="@android:anim/accelerate_interpolator"/>

    java调用

Button button = (Button) findViewById(R.id.button);

Animator mAnim = AnimatorInflater.loadAnimator(this, R.animator.animator);

mAnim.setTarget(button);

mAnim.start();

3.2 纯java方式

ObjectAnimator mAnimator = ObjectAnimator.ofFloat(view, type, start, end);

// 设置动画重复播放次数 = 重放次数+1

// 动画播放次数 = infinite时,动画无限重复

mAnimator.setRepeatCount(ValueAnimator.INFINITE);

// 设置动画运行的时长

mAnimator.setDuration(time);

// 设置动画延迟播放时间

mAnimator.setStartDelay(0);

// 设置重复播放动画模式

mAnimator.setRepeatMode(ValueAnimator.RESTART);

// ValueAnimator.RESTART(默认):正序重放

// ValueAnimator.REVERSE:倒序回放

//设置差值器

mAnimator.setInterpolator(new LinearInterpolator());

return mAnimator;

3.3 ValueAnimator值动画,主要负责值的计算和过度,以及动画的播放次数、播放模式和动画监听等

ValueAnimator animator = ValueAnimator.ofFloat(1, 0.5f, 1);

animator.setDuration(3000);

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

float value = (Float) animation.getAnimatedValue();

imageView.setScaleX(value);

}

});

animator.start();

3.4 ObjectAnimator对象动画,继承ValueAnimator,可以直接修改对象的属性

ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, "scaleX", 1, 0.5f, 1);

animator.setDuration(3000);

animator.start();

3.5 PropertyValuesHolder,用来保存属性的值

PropertyValuesHolder xHolder = PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.5f, 1.0f);

PropertyValuesHolder yHolder = PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.5f, 1.0f);

ObjectAnimator.ofPropertyValuesHolder(imageView, xHolder, yHolder)

.setDuration(3000)

.start();

3.6 AnimatorSet,实现多个动画效果

ObjectAnimator xAnimator = ObjectAnimator.ofFloat(imageView, "scaleX", 1.0f, 0.5f, 1.0f);

ObjectAnimator yAnimator = ObjectAnimator.ofFloat(imageView, "scaleY", 1.0f, 0.5f, 1.0f);

AnimatorSet animator = new AnimatorSet();

animator.playTogether(xAnimator, yAnimator);

animator.setDuration(3000);

animator.start();

AnimatorSet还可以指定动画的顺序,调用playSequentially()方法依次播放动画 

ObjectAnimator animator1 = ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0.5f, 1.0f);

animator1.setDuration(2000);

ObjectAnimator xAnimator2 = ObjectAnimator.ofFloat(imageView, "scaleX", 1.0f, 0.5f, 1.0f);

ObjectAnimator yAnimator2 = ObjectAnimator.ofFloat(imageView, "scaleY", 1.0f, 0.5f, 1.0f);

AnimatorSet scaleAnimator = new AnimatorSet();

scaleAnimator.playTogether(xAnimator2, yAnimator2);

scaleAnimator.setDuration(2000);

ObjectAnimator animator3 = ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f);

animator3.setDuration(2000);

AnimatorSet animator = new AnimatorSet();

animator.playSequentially(animator1, scaleAnimator, animator3);

animator.start();

3.7 Evaluator估值器,告诉动画系统如何从初始值过度到结束值

IntEvaluator :用于计算int类型属性值的计算器FloatEvaluator :用于计算float类型属性值的计算器ArgbEvaluator :用于计算十六进制形式表示的颜色值的计算器TypeEvaluator:计算器的接口,我们可以实现该接口来完成自定义计算器

四 过渡动画,即Activity转场动画 

4.1 定义动画xml

android:duration="270"

android:fromXDelta="100%p"

android:toXDelta="0%p" />

android:duration="270"

android:fromXDelta="0%p"

android:toXDelta="-100%p" />

4.2 设置style

4.3 java调用

startActivity(intent);

overridePendingTransition(R.anim.bottom_top_anim, R.anim.alpha_hide);

finish();

overridePendingTransition(R.anim.alpha_show, R.anim.top_bottom_anim);

4.4 Android5.0之后,Android就自带几种动画特效。 3种转场动画 ,1种共享元素

   三种转场动画

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

public void explode(View view) {

intent = new Intent(this, TransitionActivity.class);

intent.putExtra("flag", 0);

startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

public void slide(View view) {

intent = new Intent(this, TransitionActivity.class);

intent.putExtra("flag", 1);

startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

public void fade(View view) {

intent = new Intent(this, TransitionActivity.class);

intent.putExtra("flag", 2);

startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

}

共享动画

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

public void share(View view) {

View fab = findViewById(R.id.fab_button);

intent = new Intent(this, TransitionActivity.class);

intent.putExtra("flag", 3);

//创建单个共享

//startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, view, "share")

// .toBundle());

//创建多个共享

startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, Pair.create

(view, "share"),

Pair.create(fab,"fab"))

.toBundle());

}

柚子快报邀请码778899分享:Android之 动画总结

http://www.51969.com/

查看原文