android 帧动画,补间动画,属性动画的简单总结
帧动画——FrameAnimation
将一系列图片有序播放,形成动画的效果。其本质是一个Drawable,是一系列图片的集合,本身可以当做一个图片一样使用
在Drawable文件夹下,创建animation-list为根节点的资源文件
<animation-listandroid:oneshot="false"> <itemandroid:drawable="@drawable/img1"android:duration="100"/> <itemandroid:drawable="@drawable/img2"android:duration="100"/> <itemandroid:drawable="@drawable/img3"android:duration="100"/> <itemandroid:drawable="@drawable/img4"android:duration="100"/> </animation-list>
oneshot:是否只播放一次
drawable:一帧引用的图片
duration:一帧播放的时间
播放动画
将动画作为控件的背景
((AnimationDrawable)view.getBackground()).start();
Animation常用属性
duration:动画时间
repeatCount:重复次数infinite无限次
fillAfter:是否停止在最后一帧
repeatMode:重复模式 值:restart重新开始,reserve反复
startOffset:开始延迟时间
补间动画TweenAnimation
只能应用于View对象,只支持部分属性,Viewanimation值改变了View绘制的位置,并没有改变对象本身的真实位置
可以使用XML定义也可以使用代码定义 XML定义的动画放在/res/anim/文件夹内
开始动画通过view的startAnimation(Animationa) 参数定义的动画
四种补间动画通过XML定义
AlphaAnimation:透明度动画
<?xmlversion="1.0"encoding="utf-8"?> <alphaxmlns:android="http://schemas.android.com/apk/res/android" android:fromAlpha="0" android:toAlpha="1" android:duration="2000"> <!-- fromAlpha起始透明度0为完全透明1为不透明0~1之间的浮点值 toAlpha结束透明度 duration动画运行时间单位毫秒 --> </alpha>
AlphaAnimationalphaAnimation=null; //加载XML中的动画XML文件 alphaAnimation=(AlphaAnimation)AnimationUtils.loadAnimation(MainActivity.this,R.anim.anim_alpha); //常用属性设置各种动画通用 alphaAnimation.setRepeatCount(3);//执行动画效果结束后重复执行3次一共4次 alphaAnimation.setRepeatMode(Animation.REVERSE);//重复模式 //动画结束是否停止在最后一帧 alphaAnimation.setFillAfter(true); //动画结束是否停止在第一帧 alphaAnimation.setFillBefore(false); //设置插值器动画执行速度变速加减速。。 //AccelerateInterpolator减速 //DecelerateInterpolator加速 alphaAnimation.setInterpolator(newAccelerateDecelerateInterpolator());
ScaleAnimation:缩放动画
代码加载的方式和方法的使用与AlphaAnimation一样
<?xmlversion="1.0"encoding="utf-8"?> <scalexmlns:android="http://schemas.android.com/apk/res/android" android:toXScale="1" android:toYScale="1" android:fromXScale="0.1" android:fromYScale="0.1" android:pivotY="0%" android:pivotX="0%" android:duration="2000"> <!-- 浮点值表示倍数自身几倍 fromXScale动画在X轴以自身几倍伸缩开始 toXScale动画在X轴以自身几倍伸缩结束 fromYScale动画在Y轴以自身几倍伸缩开始 toYScale动画在Y轴以自身几倍伸缩结束 pivotX动画相对于控件自身的X坐标的开始位置 pivotY动画相对于控件自身的Y坐标的开始位置 0%0%表示控件左上角为0,0原点坐标 --> </scale>
TranslateAnimation:平移动画
<?xmlversion="1.0"encoding="utf-8"?> <translatexmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="-100%p" android:fromYDelta="0" android:toXDelta="100%p" android:toYDelta="0" android:duration="2000"> <!-- fromXDeltax轴起始位置 toXDeltaX轴结束位置 fromYDeltay轴起始位置 toYDeltay轴结束位置 100%p表示相对于父级 100%相对于自身 --> </translate>
RotateAnimation:旋转动画
<?xmlversion="1.0"encoding="utf-8"?> <rotatexmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:toDegrees="360" android:duration="2000" android:pivotX="50%" android:pivotY="50%" android:interpolator="@android:anim/accelerate_decelerate_interpolator"> <!-- interpolator指定动画的插值器 accelerate_decelerate_interpolator加速-减速 accelerate_interpolator加速 decelerate_interpolator减速 fromDegrees动画起始角度 toDegrees动画结束旋转的角度可以大于360度 负数表示逆时针旋转正数表示顺时针旋转 pivotX相对于view的X坐标的开始位置 pivotY相对于view的Y坐标的开始位置 绝对尺寸100px 50%相对尺寸相对于自身的50% 50%p相对尺寸相对于父容器的50% 50%为物件的X或Y方向坐标上的中点位置 duration动画播放时间单位毫秒 --> </rotate>
通过构造方法创建
构造参数详解 此段内容选自http://www.cnblogs.com/aimeng/archive/2011/10/10/2206710.html
//在代码中定义动画实例对象 privateAnimationmyAnimation_Alpha; privateAnimationmyAnimation_Scale; privateAnimationmyAnimation_Translate; privateAnimationmyAnimation_Rotate; //根据各自的构造方法来初始化一个实例对象 myAnimation_Alpha=newAlphaAnimation(0.1f,1.0f); myAnimation_Scale=newScaleAnimation(0.0f,1.4f,0.0f,1.4f, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); myAnimation_Translate=newTranslateAnimation(30.0f,-80.0f,30.0f,300.0f); myAnimation_Rotate=newRotateAnimation(0.0f,+350.0f, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
AlphaAnimation
AnimationAlphaAnimation(floatfromAlpha,floattoAlpha) //第一个参数fromAlpha为动画开始时候透明度 //第二个参数toAlpha为动画结束时候透明度 myAnimation_Alpha=newAlphaAnimation(0.1f,1.0f); //说明: //0.0表示完全透明 //1.0表示完全不透明 myAnimation_Alpha.setDuration(5000); //设置时间持续时间为5000毫秒
ScaleAnimation
ScaleAnimation(floatfromX,floattoX,floatfromY,floattoY, intpivotXType,floatpivotXValue,intpivotYType,floatpivotYValue) //第一个参数fromX为动画起始时X坐标上的伸缩尺寸 //第二个参数toX为动画结束时X坐标上的伸缩尺寸 //第三个参数fromY为动画起始时Y坐标上的伸缩尺寸 //第四个参数toY为动画结束时Y坐标上的伸缩尺寸 /*说明: 以上四种属性值 0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大 */ //第五个参数pivotXType为动画在X轴相对于物件位置类型 //第六个参数pivotXValue为动画相对于物件的X坐标的开始位置 //第七个参数pivotXType为动画在Y轴相对于物件位置类型 //第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置 myAnimation_Scale=newScaleAnimation(0.0f,1.4f,0.0f,1.4f, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); myAnimation_Scale.setDuration(700); //设置时间持续时间为700毫秒
TranslateAnimation
TranslateAnimation(floatfromXDelta,floattoXDelta, floatfromYDelta,floattoYDelta) //第一个参数fromXDelta为动画起始时X坐标上的移动位置 //第二个参数toXDelta为动画结束时X坐标上的移动位置 //第三个参数fromYDelta为动画起始时Y坐标上的移动位置 //第四个参数toYDelta为动画结束时Y坐标上的移动位置
RotateAnimation
RotateAnimation(floatfromDegrees,floattoDegrees, intpivotXType,floatpivotXValue,intpivotYType,floatpivotYValue) //第一个参数fromDegrees为动画起始时的旋转角度 //第二个参数toDegrees为动画旋转到的角度 //第三个参数pivotXType为动画在X轴相对于物件位置类型 //第四个参数pivotXValue为动画相对于物件的X坐标的开始位置 //第五个参数pivotXType为动画在Y轴相对于物件位置类型 //第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置 myAnimation_Rotate=newRotateAnimation(0.0f,+350.0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
属性动画
相对补间动画 属性动画会真正的使目标对象的属性值发生改变,不像补间动画只是影像的改变 只能修改具有get/set方法的属性值
因为可以修改对象的属性,属性动画可以做到更多的效果,改变文本大小,背景颜色等等
属性动画创建在res/animator
ValueAnimator
包含属性动画的所有核心功能,动画时间,开始、结束属性值,属性值计算方法等。
ValuAnimiator设置开始结束值实现ValueAnimator.onUpdateListener接口,
这个接口只有一个函数onAnimationUpdate(),在这个函数中会传入ValueAnimator对象做为参数,通过这个ValueAnimator对象的getAnimatedValue()函数可以得到当前的属性值
把属性值设置给某个控件的某个属性
使用xml
<?xmlversion="1.0"encoding="utf-8"?> <animatorxmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:valueFrom="0" android:valueTo="300" android:valueType="intType" android:interpolator="@android:interpolator/overshoot"> <!-- valueFrom起始值 valueTo结束值 valueType值的类型 intType整数值、floatType浮点值、colorType颜色值 interpolator插值器 --> </animator>
ValueAnimatorvalueAnimator=null; //通过AnimatorInflater.loadAnimator()加载xml创建ValueAnimator valueAnimator=(ValueAnimator)AnimatorInflater.loadAnimator(this,R.animator.animator_value); //动画执行时间 valueAnimator.setDuration(3000); //值改变监听 valueAnimator.addUpdateListener(listener); //开始动画 valueAnimator.start();
privateValueAnimator.AnimatorUpdateListenerlistener=newValueAnimator.AnimatorUpdateListener(){ @Override publicvoidonAnimationUpdate(ValueAnimatoranimation){ //获取值 intvalue=(int)animation.getAnimatedValue(); //btnValueAnimator为测试控件 //设置控件X轴平移 btnValueAnimator.setTranslationX(value); } };
使用代码
/** *valueAnimator单个值 */ //代码创建ValueAnimator类自身的方法 //ofFloat值类型float ValueAnimatorvalueAnimator=ValueAnimator.ofFloat(0,1); //ofInt值类型int从0~300 valueAnimator=ValueAnimator.ofInt(0,300); //也可以用来设置颜色在颜色改变过程中会将颜色变化情况显示出来 //红色到蓝色的改变过程显示N种颜色 valueAnimator=ValueAnimator.ofInt(Color.RED,Color.BLUE); //ofArgb设置颜色如果无法使用是的sdk版本低了 //这个方法改变颜色过程中只显示红色和蓝色 //valueAnimator=ValueAnimator.ofArgb(Color.RED,Color.BLUE); //设置插值器 valueAnimator.setInterpolator(newCycleInterpolator()); /** * *ValueAnimator.ofPropertyValuesHolder设置多个值 */ //设置动画属性参数1:名字参数2,3值的变化区间 PropertyValuesHolderalphaHolder=PropertyValuesHolder.ofFloat("alpha",0f,1f); PropertyValuesHolderwidthHolder=PropertyValuesHolder.ofInt("width",0,300); //ValueAnimator.ofPropertyValuesHolder添加holder创建动画 valueAnimator=ValueAnimator.ofPropertyValuesHolder(alphaHolder,widthHolder); //动画执行时间 valueAnimator.setDuration(3000); //值改变监听 valueAnimator.addUpdateListener(listener);
privateValueAnimator.AnimatorUpdateListenerlistener=newValueAnimator.AnimatorUpdateListener(){ @Override publicvoidonAnimationUpdate(ValueAnimatoranimation){ /** *单个值获取getAnimatedValue取出变化值根据设置类型强转 *btnValueAnimator测试用的button */ //intvalue=(int)animation.getAnimatedValue(); //btnValueAnimator.setTranslationX(value);横坐标平移 //floatvalue=(float)valueAnimator.getAnimatedValue(); //btnValueAnimator.setAlpha(value);透明度改变 //intvalue=(int)animation.getAnimatedValue(); //btnValueAnimator.setTextColor(value);文字颜色改变 /** *PropertyValuesHolder存了多个值通过名字获取强制转换 */ floatalpha=(float)valueAnimator.getAnimatedValue("alpha"); intwidth=(int)valueAnimator.getAnimatedValue("width"); btnValueAnimator.setAlpha(alpha);//改变透明度 //图像绘制左边不变从右边慢慢增加 //修改控件的widthheight不能使用setWidth或setHeight btnValueAnimator.setRight(width); //btnValueAnimator.setBottom(width); } };
ObjectAnimator:
继承自ValueAnimator,要指定一个对象及该对象的一个属性,当属性值计算完成时自动设置为该对象的相应属性,不需要设置监听,底层自动完成,一般会用ObjectAnimator来改变某一对象的某一属性
//用来测试的button ButtonbtnObjectAnimator=(Button)findViewById(R.id.btn_object_animator); //加载动画 ObjectAnimatorobjectAnimator=(ObjectAnimator)AnimatorInflater.loadAnimator(this,R.animator.animator_object); //绑定控件 objectAnimator.setTarget(btnObjectAnimator); //参数1绑定控件参数2设置属性参数3设置值 objectAnimator=ObjectAnimator.ofInt(btnObjectAnimator,"textColor",Color.RED); //PropertyValuesHolder设置多个属性 PropertyValuesHoldertranslationXHolder=PropertyValuesHolder.ofFloat("translationX",0,300); PropertyValuesHoldertranslationYHolder=PropertyValuesHolder.ofFloat("translationY",0,200); objectAnimator=ObjectAnimator.ofPropertyValuesHolder(btnObjectAnimator,translationXHolder,translationYHolder); objectAnimator.setDuration(3000); //开始动画 objectAnimator.start();
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!