Android三大动画整理

Android三大动画整理,第1张

概述目录一、帧动画(FrameAnimation)1、简介2、实现1)xml实现(在res/drawable下创建)2)java实现二、补间动画(TweenAnimation)1、简介2、分类3、属性4、透明度动画(AlphaAnimation)1)xml实现(在res/anim下创建)2)java实现5、缩放动画(ScaleAnimation)6、旋转动画(RotateAnimat

目录一、帧动画(Frame Animation)1、简介2、实现1)xml实现(在res/drawable下创建)2)java实现二、补间动画(Tween Animation)1、简介2、分类3、属性4、透明度动画(AlphaAnimation)1)xml实现(在res/anim下创建)2)java实现5、缩放动画(ScaleAnimation)6、旋转动画(RotateAnimation)7、平移动画(TranslateAnimation)8、动画合集(AnimationSet)9、监听动画三、属性动画(Property Animation)1、简介2、属性动画与补间动画的区别3、ValueAnimator4、ObjectAnimator5、组合动画6、Animator监听器7、PropertyValuesHolder8、在XML中使用属性动画

一、帧动画(Frame Animation)1、简介

就像gif图片,通过一系列Drawable依次显示来模拟动画的效果。

2、实现1)xml实现(在res/drawable下创建)

步骤一:创建帧动画文件

<?xml version="1.0" enCoding="utf-8"?><animation-List xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:oneshot="false">    <!--oneshot:是否只播放一次-->    <item        androID:drawable="@drawable/picture"        androID:duration="1000"/>    <item        androID:drawable="@drawable/ic_launcher_background"        androID:duration="1000"/></animation-List>

步骤二:将动画设置给控件

//方式一:设置成图片资源imageVIEw.setimageResource(R.drawable.frame_anim);//方式二:设置成背景资源//如果单纯想显示动画,需要把androID:src去掉。否则图片会在动图上面imageVIEw.setBackgroundResource(R.drawable.frame_anim);

步骤三:获取AnimationDrawable对象(根据步骤二不同选择不同方式)

//方式一AnimationDrawable animationDrawable = (AnimationDrawable) imageVIEw.getDrawable();//方式二AnimationDrawable animationDrawable = (AnimationDrawable) imageVIEw.getBackground();

步骤四:开始动画

animationDrawable.start();
2)java实现
        //1、创建AnimationDrawable对象        AnimationDrawable animationDrawable = new AnimationDrawable();        //2、设置是否播放一次        animationDrawable.setoneshot(false);        //3、添加帧图片        Drawable drawable1 = ContextCompat.getDrawable(this, R.drawable.picture);        Drawable drawable2 = ContextCompat.getDrawable(this, R.drawable.ic_launcher_background);        //添加帧图片,并设置持续时间        animationDrawable.addFrame(drawable1, 1000);        animationDrawable.addFrame(drawable2, 1000);        //4、将动画设置给控件        imageVIEw.setimageDrawable(animationDrawable);        //或者        //imageVIEw.setBackgroundDrawable(animationDrawable);        //5、开始动画        animationDrawable.start();
二、补间动画(Tween Animation)1、简介

Tween Animation就是一系列VIEw形状的变换,如大小的缩放、透明度的改变、水平位置的改变、旋转位置改变。动画的定义既可以用java代码定义也可以用XML定义。

2、分类
xml标签java对象功能
AlphaAlphaAnimation透明度动画
scaleScaleAnimation缩放动画
rotateRotateAnimation旋转动画
translateTranslateAnimation平移动画
setAnimationSet补间动画集合
3、属性
属性功能可适用动画
androID:interpolator动画运动的插值器
可以匀速、加速、减速或抛物线速度等各种速度变化
ALL
androID:duration持续的时间,单位为毫秒ALL
androID:repeatMode动画的重复方式。
可为reverse(反向)或restart(重新开始)(默认)
ALL
androID:repeatCount动画的重复次数,播放次数=重复次数+1。
可以是infinite(无限循环)
ALL
androID:fillEnabled是否使用fillBefore值,默认为trueALL
androID:fillBefore动画完成后,保持动画前状态,默认trueALL
androID:fillAfter动画完成后,保持动画后状态,默认falseALL
androID:startOffset动画开始延迟时间ALL
androID:fromAlpha动画开始时的透明度。
0.0代表完全透明;1.0代表完全不透明
AlphaAnimation
androID:toAlpha动画结束时的透明度。
0.0代表完全透明;1.0代表完全不透明
AlphaAnimation
androID:fromXScale动画开始时x轴上的缩放系数ScaleAnimation
androID:toXScale动画结束时x轴上的缩放系数ScaleAnimation
androID:fromYScale动画开始时y轴上的缩放系数ScaleAnimation
androID:toYScale动画结束时y轴上的缩放系数ScaleAnimation
androID:pivotX缩放、旋转中心点x坐标ScaleAnimation
RotateAnimation
androID:pivotY缩放、旋转中心点y坐标ScaleAnimation
RotateAnimation
androID:fromdegrees动画开始时旋转的角度RotateAnimation
androID:todegrees动画结束时旋转的角度RotateAnimation
androID:fromXDelta动画开始时x轴上的起始位置TranslateAnimation
androID:toXDelta动画结束时x轴上的起始位置TranslateAnimation
androID:fromYDelta动画开始时y轴上的起始位置TranslateAnimation
androID:toYDelta动画结束时y轴上的起始位置TranslateAnimation

androID:interpolotor的常用属性值

属性描述
@androID:anim/linear_interpolator动画一直在做匀速改变
@androID:anim/accelerate_interpolator在动画开始的地方改变速度较慢,然后开始加速
@androID:anim/decelerate_interpolator在动画开始的地方改变速度较快,然后开始减速
@androID:anim/accelerate_decelerate_interpolator动画在开始和结束的地方改变速度较慢,在中间的时候加速
@androID:anim/cycle_interpolator动画循环播放特定的次数,速率改变沿着正弦曲线
@androID:anim/bounce_interpolator动画结束的地方采用d球效果
@androID:anim/anticipate_interpolator在动画开始的地方先向后退一小步,再快速到达动画结束的地方
@androID:anim/overshoot_interpolator动画快速到达终点,并超出一小步最后回到动画结束的地方
@androID:anim/anticipate_overshoot_interpolator在动画开始的地方先向后退一小步,再开始动画,到结束的地方再超出一小步,最后回到动画结束的地方

pivotX等取值类型有三种:数字、百分比、百分比+”p”
数字:例如50.0,这里的单位是px像素
百分比:例如50%,这里是相对于自己控件的百分比
百分比+”p”:例如50%p,这里是表示相对于自己控件的父控件的百分比

4、透明度动画(AlphaAnimation)1)xml实现(在res/anim下创建)
// 1、创建动画文件<?xml version="1.0" enCoding="utf-8"?><Alpha xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:duration="500"    androID:fromAlpha="1.0"    androID:toAlpha="0.2"    androID:repeatCount="2"></Alpha>//2、加载动画资源Animation animation = AnimationUtils.loadAnimation(this, R.anim.Alpha_anim);//3、开启动画imageVIEw.startAnimation(animation);
2)java实现
//romAlpha:开始透明度。取值范围(全透明0.0f~不透明1.0f)//toAlpha:结束透明度。 取值范围(全透明0.0f~不透明1.0f)AlphaAnimation(float fromAlpha, float toAlpha)
        //1、创建动画,并设置相关属性        AlphaAnimation animation = new AlphaAnimation(1.0f,0.2f);        animation.setDuration(500);        animation.setRepeatCount(2);        //2、开启动画        imageVIEw.startAnimation(animation);
5、缩放动画(ScaleAnimation)
// fromX:开始缩放的X轴倍数。如1.0f:本身大小;如2.0f:从自己两倍开始// toX:结束缩放的X轴倍数。// fromY:开始缩放的Y轴倍数。// toY:结束缩放的Y轴倍数。// pivotXType:X轴缩放中心点类型;可选值有:		Animation.relative_TO_SELF相对自己--常用		Animation.relative_TO_PARENT相对父窗体		Animation.absolute 绝对的---不常用// pivotXValue:在pivotXType的基础上,X轴缩放中心的位置。如:0.5f:缩放中心就在控件的一半的位置。如果是0.0f,则会在控件本身的左边位置// pivotYType:X轴缩放中心点类型;同上 ...// pivotYValue:在pivotYType的基础上,Y轴缩放中心的位置。ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
6、旋转动画(RotateAnimation)
//fromdegrees:开始旋转的角度//todegrees:结束旋转的角度//pivotXType:参照缩放动画//pivotXValue:参照缩放动画//pivotYType:参照缩放动画//pivotYValue:参照缩放动画RotateAnimation(float fromdegrees, float todegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
7、平移动画(TranslateAnimation)
//fromXType:开始平移的X轴参照位置,一般使用Animation.relative_TO_SELF//fromXValue:X轴平移的开始倍数。在fromXType的基础上。//toXType:结束平移的X轴参照位置//toXValue:X轴平移的结束倍数。//fromYType:开始平移的Y轴参照位置//fromYValue:Y轴平移的开始倍数。//toYType:结束平移的Y轴参照位置//toYValue:Y轴平移的结束倍数。TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)
8、动画合集(AnimationSet)xml实现(在res/anim下创建)
<?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.2"        androID:repeatCount="2"/>    <translate        androID:fromXDelta="-30%p"        androID:toXDelta="30%p"        androID:fromYDelta="0"        androID:toYDelta="0"        androID:duration="1000"        androID:repeatCount="5"/></set>
java实现
        AnimationSet animationSet = new AnimationSet(true);        //将动画一个一个添加进来        animationSet.addAnimation(animation);        imageVIEw.startAnimation(animationSet);
9、监听动画
        animation.setAnimationListener(new Animation.AnimationListener() {        	//动画开始时调用            @OverrIDe            public voID onAnimationStart(Animation animation) {                            }			//动画结束时调用            @OverrIDe            public voID onAnimationEnd(Animation animation) {            }			//动画重复时调用            @OverrIDe            public voID onAnimationRepeat(Animation animation) {            }        });
三、属性动画(Property Animation)1、简介

自AndroID 3.0版本开始,系统给我们提供了一种全新的动画模式,属性动画(property animation).
属性动画的运行机制是通过不断地对值进行 *** 作来实现的。
它的功能非常强大,弥补了之前补间动画的一些缺陷,几乎是可以完全替代掉补间动画了。

2、属性动画与补间动画的区别

最大的区别是补间动画就算控件移动到任何位置,控件本身位置还是不变。而属性动画是直接改变控件的位置。

3、ValueAnimator

ValueAnimator不提供任何动画效果,它更像一个数值发生器,用来产生有一定规律的数字,从而让调用者控制动画的实现过程。

        //1、构建ValueAnimator的实例        //参数:一组动画变化过程的值        ValueAnimator animator = ValueAnimator.offloat(0, 180);        //2、设置相关属性        animator.setDuration(1000);        //3、设置动画的监听        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @OverrIDe            public voID onAnimationUpdate(ValueAnimator animation) {                //4、利用添加的监听函数获取当前动画的值,getAnimatedValue()                float rotation = (float) animation.getAnimatedValue();                //5、设置给VIEw                //旋转180度                imageVIEw.setRotation(rotation);            }        });        //6、开始动画        animator.start();
VIEw方法功能
setX(float x)x轴平移
setY(float y)y轴平移
setRotation(float rotation)自身平面旋转
setRotationX(float rotationX)3D翻转 x轴不变
setRotationY(float rotationY)3D翻转 y轴不变
setAlpha(float Alpha)透明度
setScaleX(float scaleX)横向缩放
setScaleY(float scaleY)纵向缩放
setTranslationX(float translationX)x轴上移动(从自身开始)
setTranslationY(float translationY)y轴上移动(从自身开始)
4、ObjectAnimator

ObjectAnimator是属性动画最重要的类,创建一个ObjectAnimator只需通过其静态工厂类直接返还一个ObjectAnimator对象。

        //1、构建ObjectAnimator的实例        //ObjectAnimator.offloat(Object target, String propertyname, float... values)        //target:需要执行动画的组件        //propertyname:动画类型        //values:一组动画变化过程的值        ObjectAnimator animator = ObjectAnimator.offloat(imageVIEw, "rotation", 0, 180);        //2、设置相关属性        animator.setDuration(5000);        animator.setRepeatCount(3);        //3、开始动画        animator.start();
动画类型功能
Xx轴平移
Yy轴平移
rotation自身平面旋转
rotationX3D翻转 x轴不变
rotationY3D翻转 y轴不变
Alpha透明度
scaleX横向缩放
scaleY纵向缩放
translationXx轴上移动(从自身开始)
translationYy轴上移动(从自身开始)
5、组合动画

实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例。
AnimatorSet.Builder中包括以下四个方法:

after(Animator anim):将现有动画插入到传入的动画之后执行。after(long delay):将现有动画延迟指定毫秒后执行。before(Animator anim):将现有动画插入到传入的动画之前执行。with(Animator anim):将现有动画和传入的动画同时执行。
        ObjectAnimator translationX = ObjectAnimator.offloat(imageVIEw, "translationX", 200);        ObjectAnimator rotation = ObjectAnimator.offloat(imageVIEw, "rotation", 0, 360);        ObjectAnimator Alpha = ObjectAnimator.offloat(imageVIEw, "Alpha", 1, 0, 1);        AnimatorSet animatorSet = new AnimatorSet();        //执行Alpha后再同时执行translationX和rotation        //animatorSet.play(translationX).with(rotation).after(rotation);                //同时执行translationX、rotation、rotation        animatorSet.playTogether(translationX, rotation, Alpha);        animatorSet.setDuration(5000);        animatorSet.start();
6、Animator监听器
		objectAnimator.addListener(new Animator.AnimatorListener() {            /**             * 动画开始前的 *** 作             * @param animation             */            @OverrIDe            public voID onAnimationStart(Animator animation) {            }            /**             * 动画结束的 *** 作             * @param animation             */            @OverrIDe            public voID onAnimationEnd(Animator animation) {            }            /**             * 动画取消的 *** 作             * @param animation             */            @OverrIDe            public voID onAnimationCancel(Animator animation) {            }            /**             * 动画重复的 *** 作             * @param animation             */            @OverrIDe            public voID onAnimationRepeat(Animator animation) {            }        });

如果只关心动画的结束状态:

		objectAnimator.addListener(new AnimatorListenerAdapter() {            @OverrIDe            public voID onAnimationEnd(Animator animation) {                super.onAnimationEnd(animation);            }        });
7、PropertyValuesHolder

还可以使用PropertyValuesHolder类来实现组合动画。不过这个组合动画就没有上面的丰富了,使用PropertyValuesHolder类只能是多个动画一起执行。

PropertyValuesHolder pv1 = PropertyValuesHolder.offloat("rotation", 0, 359);PropertyValuesHolder pv2 = PropertyValuesHolder.offloat("scaleX", 1, 2);PropertyValuesHolder pv3 = PropertyValuesHolder.offloat("translationX", 0, 200);PropertyValuesHolder pv4 = PropertyValuesHolder.offloat("Alpha", 0.5f, 1f);//将所有的组合动画添加到ObjectAnimator中ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(iv, pv1, pv2, pv3, pv4);oa.setDuration(5000);oa.start();
8、在XML中使用属性动画

要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在这个文件夹当中。
可以使用如下三种标签:

animator:对应代码中的ValueAnimatorobjectAnimator:对应代码中的ObjectAnimatorset:对应代码中的AnimatorSet
属性功能适用对象
androID:interpolator动画运动的插值器
可以匀速、加速、减速或抛物线速度等各种速度变化
animator
objectAnimator
androID:duration持续的时间,单位为毫秒animator
objectAnimator
androID:valueFrom动画开始的值animator
objectAnimator
androID:valueto动画结束的值animator
objectAnimator
androID:valueTypevalueFrom和valueto的数据类型animator
objectAnimator
androID:startOffset动画开始延迟时间animator
objectAnimator
androID:repeatCount动画的重复次数,播放次数=重复次数+1。
可以是infinite(无限循环)
animator
objectAnimator
androID:repeatMode动画的重复方式。
可为reverse(反向)或restart(重新开始)(默认)
animator
objectAnimator
androID:propertyname动画属性的名称objectAnimator
androID:ordering执行顺序。
可为together(同时执行)或sequentially(顺序执行)
set

animator

//1、在res/animator目录下创建XML文件<?xml version="1.0" enCoding="utf-8"?><animator xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:valueFrom="0"    androID:valueto="360"    androID:duration="2000"    androID:valueType="intType"></animator>//2、在代码中加载动画文件        //加载动画        ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(this, R.animator.animator);        //作用对象        animator.setTarget(imageVIEw);        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @OverrIDe            public voID onAnimationUpdate(ValueAnimator animation) {                int rotation = (int) animation.getAnimatedValue();                imageVIEw.setRotation(rotation);            }        });        //开始动画        animator.start();

objectAnimator

//1、在res/animator目录下创建XML文件<?xml version="1.0" enCoding="utf-8"?><objectAnimator xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:propertyname="Alpha"    androID:valueType="floatType"    androID:valueFrom="0.2"    androID:valueto="1"    androID:duration="5000"></objectAnimator>//2、在代码中加载动画文件        Animator animator = AnimatorInflater.loadAnimator(this, R.animator.object_animator);        animator.setTarget(imageVIEw);        animator.start();

set

<?xml version="1.0" enCoding="utf-8"?><set xmlns:androID="http://schemas.androID.com/apk/res/androID">    <set androID:ordering="together">        <objectAnimator            androID:propertyname="rotationY"            androID:valueType="floatType"            androID:valueFrom="0"            androID:valueto="360"            androID:duration="5000"/>        <objectAnimator            androID:propertyname="scaleX"            androID:valueType="floatType"            androID:valueFrom="0.2"            androID:valueto="1"            androID:duration="5000"/>        <objectAnimator            androID:propertyname="scaleY"            androID:valueType="floatType"            androID:valueFrom="0.2"            androID:valueto="1"            androID:duration="5000"/>        <objectAnimator            androID:propertyname="Alpha"            androID:valueType="floatType"            androID:valueFrom="0.2"            androID:valueto="1"            androID:duration="5000"/>    </set>    <set androID:ordering="sequentially">        <objectAnimator            androID:propertyname="translationX"            androID:valueType="floatType"            androID:valueFrom="0"            androID:valueto="-300"            androID:duration="1000"/>        <objectAnimator            androID:propertyname="translationY"            androID:valueType="floatType"            androID:valueFrom="0"            androID:valueto="600"            androID:duration="1000"/>        <objectAnimator            androID:propertyname="translationX"            androID:valueType="floatType"            androID:valueFrom="-300"            androID:valueto="300"            androID:duration="1000"/>        <objectAnimator            androID:propertyname="translationY"            androID:valueType="floatType"            androID:valueFrom="600"            androID:valueto="0"            androID:duration="1000"/>        <objectAnimator            androID:propertyname="translationX"            androID:valueType="floatType"            androID:valueFrom="300"            androID:valueto="0"            androID:duration="1000"/>    </set></set>
总结

以上是内存溢出为你收集整理的Android三大动画整理全部内容,希望文章能够帮你解决Android三大动画整理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1042978.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存