一、简介:
Android 系统一开始给我们提供两种实现动画效果(逐帧动画(frame-by-frame animation)和补间动画(tweened animation))。逐帧动画的工作原理很简单,其实就是将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似于动画片的工作原理。补间动画则是可以对View进行一系列的动画操作,包括淡入淡出、缩放、平移、旋转四种。
然而自Android 3.0版本开始,系统给我们提供了一种全新的动画模式,属性动画(property animation),它的功能非常强大,弥补了之前补间动画的一些缺陷,几乎是可以完全替代掉补间动画了。
二、Android动画类型:
Android的animation由四种类型组成:
XML:
alph 渐变透明度动画效果
scale 渐变尺寸伸缩动画效果
translate 画面转换位置移动动画效果
rotate 画面转移旋转动画效果
JavaCode:
AlphaAnimation 渐变透明度动画效果
ScaleAnimation 渐变尺寸伸缩动画效果
TranslateAnimation 画面转换位置移动动画效果
RotateAnimation 画面转移旋转动画效果
三、.Android动画模式
Animation主要有两种动画模式:
一种是tweened animation(渐变动画)
XML中 JavaCode
alpha AlphaAnimation
scale ScaleAnimation
一种是frame by frame(画面转换动画)
XML中 JavaCode
translate TranslateAnimation
rotate RotateAnimation
四、XML文件中定义动画
1、在res目录中新建anim文件夹
2、在anim目录中新建一个anim.xml
4.1、alpha 渐变透明度动画效果
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha
android:duration="3000"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
<!--
透明度控制动画效果 alpha
浮点型值:
fromAlpha 属性为动画起始时透明度
toAlpha 属性为动画结束时透明度
说明:
0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之间的float数据类型的数字
长整型值:
duration 属性为动画持续时间
说明:
时间以毫秒为单位
-->
</set>
4.2、scale 渐变尺寸伸缩动画效果
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
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" />
<!--
尺寸伸缩动画效果 scale
属性:interpolator 指定一个动画的插入器
在我试验过程中,使用android.res.anim中的资源时候发现
有三种动画插入器:
accelerate_decelerate_interpolator 加速-减速 动画插入器
accelerate_interpolator 加速-动画插入器
decelerate_interpolator 减速- 动画插入器
其他的属于特定的动画效果
浮点型值:
fromXScale 属性为动画起始时 X坐标上的伸缩尺寸
toXScale 属性为动画结束时 X坐标上的伸缩尺寸
fromYScale 属性为动画起始时Y坐标上的伸缩尺寸
toYScale 属性为动画结束时Y坐标上的伸缩尺寸
说明:
以上四种属性值
0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
pivotX 属性为动画相对于物件的X坐标的开始位置
pivotY 属性为动画相对于物件的Y坐标的开始位置
说明:
以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
长整型值:
duration 属性为动画持续时间
说明: 时间以毫秒为单位
布尔型值:
fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用
-->
</set>
4.3 translate 画面转换位置移动动画效果
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="2000"
android:fromXDelta="30"
android:fromYDelta="30"
android:toXDelta="-80"
android:toYDelta="300" />
<!--
translate 位置转移动画效果
整型值:
fromXDelta 属性为动画起始时 X坐标上的位置
toXDelta 属性为动画结束时 X坐标上的位置
fromYDelta 属性为动画起始时 Y坐标上的位置
toYDelta 属性为动画结束时 Y坐标上的位置
注意:
没有指定fromXType toXType fromYType toYType 时候,
默认是以自己为相对参照物
长整型值:
duration 属性为动画持续时间
说明: 时间以毫秒为单位
-->
</set>
4.4 rotate 画面转移旋转动画效果
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<rotate
android:duration="3000"
android:fromDegrees="0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="+350" />
<!--
rotate 旋转动画效果
属性:interpolator 指定一个动画的插入器
在我试验过程中,使用android.res.anim中的资源时候发现
有三种动画插入器:
accelerate_decelerate_interpolator 加速-减速 动画插入器
accelerate_interpolator 加速-动画插入器
decelerate_interpolator 减速- 动画插入器
其他的属于特定的动画效果
浮点数型值:
fromDegrees 属性为动画起始时物件的角度
toDegrees 属性为动画结束时物件旋转的角度 可以大于360度
说明:
当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)
(负数from——to负数:逆时针旋转)
(正数from——to正数:顺时针旋转)
(正数from——to负数:逆时针旋转)
pivotX 属性为动画相对于物件的X坐标的开始位置
pivotY 属性为动画相对于物件的Y坐标的开始位置
说明: 以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
长整型值:
duration 属性为动画持续时间
说明: 时间以毫秒为单位
-->
五、Android动画--JavaCode
5.1、AlphaAnimation:
/**
* fromAlpha:动画开始时候透明度
* toAlpha:动画结束时候透明度
*/
AlphaAnimation(float fromAlpha, float toAlpha)
AlphaAnimation alphaAnimation = new AlphaAnimation(0.1f,1.0f);
alphaAnimation.setDuration(1000);
alphaAnimation.start();
5.2、ScaleAnimation
/**
* fromX为动画起始时 X坐标上的伸缩尺寸
* toX为动画结束时 X坐标上的伸缩尺寸
* fromY为动画起始时Y坐标上的伸缩尺寸
* toY为动画结束时Y坐标上的伸缩尺寸
以上四种属性值
0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
*
* pivotXType为动画在X轴相对于物件位置类型
* pivotXValue为动画相对于物件的X坐标的开始位置
* pivotXType为动画在Y轴相对于物件位置类型
* pivotYValue为动画相对于物件的Y坐标的开始位置
*/
ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue,
int pivotYType, float pivotYValue)
5.3、TranslateAnimation
/**
* fromXDelta为动画起始时 X坐标上的移动位置
* toXDelta为动画结束时 X坐标上的移动位置
* fromYDelta为动画起始时Y坐标上的移动位置
* toYDelta为动画结束时Y坐标上的移动位置
*/
TranslateAnimation(float fromXDelta, float toXDelta,float fromYDelta, float toYDelta)
5.4、RotateAnimation
/**
* fromDegrees为动画起始时的旋转角度
* toDegrees为动画旋转到的角度
* pivotXType为动画在X轴相对于物件位置类型
* pivotXValue为动画相对于物件的X坐标的开始位置
* pivotXType为动画在Y轴相对于物件位置类型
* pivotYValue为动画相对于物件的Y坐标的开始位置
*/
RotateAnimation(float fromDegrees, float toDegrees,int pivotXType, float pivotXValue,
int pivotYType, float pivotYValue)
以上就是Android补间动画、帧动画介绍和基本用法
六、属性动画
1、相关类:
ObjectAnimator:是ValueAnimator的一个子类,允许你设置一个目标对象和对象的属性进行动画,动画的执行类
ValueAnimator:属性动画主要的计时器,也计算动画后的属性的值,动画的执行类
AnimatorSet:提供组织动画的结构,使它们能相关联得运行,用于控制一组动画的执行
AnimatorInflater:用户加载属性动画的xml文件
TypeEvaluator:属性动画计算器,告诉了属性动画系统如何计算给出属性的值
TimeInterpolator:动画插入器,定义动画的变化率
2、基本用法:
这里需要注意是的属性动画文件存放目录为res/animator
2.1、ObjectAnimator
相比于ValueAnimator,ObjectAnimator可能才是我们最常接触到的类,因为ValueAnimator只不过是对值进行了一个平滑的动画过渡,但我们实际使用到这种功能的场景好像并不多。而ObjectAnimator则就不同了,它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。
ObjectAnimator是继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的。
xml中
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:propertyName="alpha"
android:repeatCount="1"
android:repeatMode="reverse"
android:startOffset="200"
android:valueFrom="0.0"
android:valueTo="1.0"
android:valueType="floatType">
<!--
duration 表示动画执行的时间
propertyName 表示修改的物件的哪个属性值,这里是透明度
valueFrom 表示从哪个状态值开始动画
valueTo 表示到哪个状态值结束动画
valueType 类型估值,主要用于设置动画操作属性的值
repeatMode 表示重复的模式 reverse表示
repeatCount 动画重复的计数,动画将会执行该值+1次
repeatMode 动画重复的模式,reverse为反向,当第偶次执行时,动画方向会相反。restart为重新执行,方向不变
startOffset, 动画多次执行的间隔时间,如果只执行一次,执行前会暂停这段时间,单位毫秒
interpolator 指定动画插入器
-->
</objectAnimator>
加载xml动画
Animator anim = AnimatorInflater.loadAnimator(this, R.animator.animator_alpha);
anim.setTarget(view);
anim.start();
①、alpha
//第一个参数为 view对象,第二个参数为 动画改变的类型,第三,第四个参数依次是开始透明度和结束透明度。
ObjectAnimator alpha = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f);
alpha.setDuration(2000);//设置动画时间
alpha.setInterpolator(new DecelerateInterpolator());//设置动画插入器,减速
alpha.setRepeatCount(-1);//设置动画重复次数,这里-1代表无限
alpha.setRepeatMode(Animation.REVERSE);//设置动画循环模式。
alpha.start();//启动动画。
②、scale
AnimatorSet scale= new AnimatorSet();//组合动画
ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1f, 0f);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1f, 0f);
scale.setDuration(2000);
scale.setInterpolator(new DecelerateInterpolator());
scale.play(scaleX).with(scaleY);//两个动画同时开始
scale.start();
③、translate
ObjectAnimator translate= ObjectAnimator.ofFloat(view, "Y",view.getY(), 0);
translate.setInterpolator(new DecelerateInterpolator());
translate.setDuration(1500);
translate.start();
④、rotate
AnimatorSet set = new AnimatorSet() ;
ObjectAnimator anim = ObjectAnimator .ofFloat(view, "rotationX", 0f, 180f);
anim.setDuration(2000);
ObjectAnimator anim2 = ObjectAnimator .ofFloat(view, "rotationX", 180f, 0f);
anim2.setDuration(2000);
ObjectAnimator anim3 = ObjectAnimator .ofFloat(view, "rotationY", 0f, 180f);
anim3.setDuration(2000);
ObjectAnimator anim4 = ObjectAnimator .ofFloat(view, "rotationY", 180f, 0f);
anim4.setDuration(2000);
set.play(anim).before(anim2); //先执行anim动画之后在执行anim2
set.play(anim3).before(anim4) ;
set.start();
⑤、改变背景(补间动画不能实现的)
ObjectAnimator translationUp = ObjectAnimator.ofInt(view, "backgroundColor", Color.RED, Color.BLUE, Color.GRAY,Color.GREEN);
translationUp.setInterpolator(new DecelerateInterpolator());
translationUp.setDuration(1500);
translationUp.setRepeatCount(-1);
translationUp.setRepeatMode(Animation.REVERSE);
/**
* ArgbEvaluator:这种评估者可以用来执行类型之间的插值整数值代表ARGB颜色。
* FloatEvaluator:这种评估者可以用来执行浮点值之间的插值。
* IntEvaluator:这种评估者可以用来执行类型int值之间的插值。
* RectEvaluator:这种评估者可以用来执行类型之间的插值矩形值。
* 由于本例是改变View的backgroundColor属性的背景颜色所以此处使用ArgbEvaluator
*/
translationUp.setEvaluator(new ArgbEvaluator());
translationUp.start();
2.2、ValueAnimator
ValueAnimator是整个属性动画机制当中最核心的一个类,前面我们已经提到了,属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,确实是一个非常重要的类。
基本用法跟ObjectAnimator相似。
2.3、AnimatorSet
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(imageView, "scaleX", 1f, 1.5f);
scaleXAnimator.setDuration(500);
scaleXAnimator.setRepeatCount(1);
scaleXAnimator.setRepeatMode(ValueAnimator.REVERSE);
scaleXAnimator.start();
ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(imageView, "scaleY", 1f, 1.5f);
scaleYAnimator.setDuration(500);
scaleYAnimator.setRepeatCount(1);
scaleYAnimator.setRepeatMode(ValueAnimator.REVERSE);
animatorSet.playTogether(scaleXAnimator, scaleYAnimator);
animatorSet.start();
上述代码通过
playTogether函数实现两个动画同时执行,如果不想同时执行,也可以调用play函数返回AnimatorSet.Builder实例,AnimatorSet.Builder提供了如下几个函数用于实现动画组合:
after(Animator anim) 将现有动画插入到传入的动画之后执行
after(long delay) 将现有动画延迟指定毫秒后执行
before(Animator anim) 将现有动画插入到传入的动画之前执行
with(Animator anim) 将现有动画和传入的动画同时执行
也可以调用playSequentially函数实现分布执行动画。
2.4、TypeEvaluator
ArgbEvaluator:这种评估者可以用来执行类型之间的插值整数值代表ARGB颜色。
FloatEvaluator:这种评估者可以用来执行浮点值之间的插值。
IntEvaluator:这种评估者可以用来执行类型int值之间的插值。
RectEvaluator:这种评估者可以用来执行类型之间的插值矩形值。
2.5、TimeInterpolator
AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator 开始的时候向后然后向前甩
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator 动画结束的时候弹起
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方快然后慢
LinearInterpolator 以常量速率改变
OvershootInterpolator 向前甩一定值后再回到原来位置
2.6、PropertyValuesHolder:PropertyValuesHolder这个类可以先将动画属性和值暂时的存储起来,后一起执行,在有些时候可以使用替换掉AnimatorSet,减少代码量。
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f, 0f, 1f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);
PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("rotationX", 0f, 180, 360f);
ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY, pvhZ).setDuration(2000).start();
PropertyValuesHolder 只能实现同时执行的动画组合相比AnimatorSet就没那么丰富了,PropertyValuesHolder 提供的函数方法有如下几种:ofInt()、ofFloat()、ofObject()、ofKeyframe()。
2.7、ViewPropertyAnimator
ViewPropertyAnimator viewPropertyAnimator=view.animate();
viewPropertyAnimator.scaleXBy(1.0f).scaleX(1.5f).scaleYBy(1.0f).scaleY(1.5f).setDuration(500).start();
多属性动画,作用于View,能够实现的动画相对单一,只能实现比如缩放,透明度改变,平移、旋转等,具体函数名字:
平移 translationX,translationY, X,Y,缩放 scaleX,scaleY, 旋转 rotationX, rotationY,
透明度 alpha
3、设置动画监听器
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
//TODO 动画开始前的操作
}
@Override
public void onAnimationEnd(Animator animation) {
//TODO 动画结束的操作
}
@Override
public void onAnimationCancel(Animator animation) {
//TODO 动画取消的操作
}
@Override
public void onAnimationRepeat(Animator animation) {
//TODO 动画重复的操作
}
});
如果我们需要简单动画执行过程中的变化可以使用AnimatorUpdateListener
objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();
//可以根据自己的需要来获取动画更新值。
Log.e("AnimatorUpdateListener", "the animation value is " + value);
}
});
4、属性动画实例
ObjectAnimator moveIn = ObjectAnimator.ofFloat(imageView, "translationX",-720, 220,0);
ObjectAnimator moveY = ObjectAnimator.ofFloat(imageView, "translationY",0, 1080,0);
ObjectAnimator rotate = ObjectAnimator.ofFloat(imageView, "rotation", 0f, 180f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(moveIn).with(fadeInOut).with(rotate).with(moveY);
animSet.setDuration(10000);
animSet.start();
以上就是android view动画,仅供大家参考。