您的位置:首页 > 移动开发 > Android开发

Android动画:帧动画、补间动画、属性动画

2016-07-12 09:29 537 查看
动画效果

Android支持的动画效果:

1. 帧动画 FrameAnimation

2. 补间动画
TweenAnimation


3. 属性动画
ObjectAnimator






帧动画:

效果:实现效果类似于Gif的动态图,即可以指定n张图片的切换效果



使用方式:

1. 在drawable文件夹中创建一个以animation-list为根标签的xml文件,

animation-list 用来代表动画集合或者动画列表

2. 在animation-list标签之间添加n个item标签,每个item代表一个要执行显示的动画,

3. 在item标签中添加以下属性:

android:duration 当前item显示的持续时间

android:drawable 当前item对应显示的图片

4. 给ImageView控件设置background属性,将写好的xml文件作为属性值

5. 在页面中获取ImageView对象,通过该对象调用getBackground方法,获取xml文件对应的AnimationDrawable对象

6. 通过获得到的AnimationDrawable对象调用start方法即可开始动画





补间动画:

效果:总共支持4种基本动画效果,分别是:平移,旋转,透明度,缩放



实现方式:

方式一(推荐):是xml+代码实现动画

通过xml文件设置动画的运行方式

a. 在res文件夹中新建anim文件夹,并在该文件夹中创建xml文件,该文件的根标签设置为想要进行的动画名称

b. 在对应的动画标签中添加相应的属性

通过在代码中加载动画文件获取要执行的动画对象

c. 在代码中通过AnimationUtils.loadAnimation(Context,int)方法加载动画文件

d. 通过控件调用startAnimation方法开启动画



如:xml文件中:

<translate

android:duration="3000"

android:fromXDelta="0"

android:fromYDelta="0"

android:toXDelta="500"

android:toYDelta="500"

android:fillAfter="true"

android:repeatCount="infinite"

android:repeatMode="reverse"

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

<!--


android:duration指定动画的执行时间

android:fromXDelta="" 确定动画起始点的x坐标

android:fromYDelta=""确定动画起始点的y坐标

android:toXDelta=""确定动画终点的x坐标

android:toYDelta=""确定动画终点的y坐标

注意:起点和终点坐标填写的数字,并不是相对于屏幕的绝对位置,而是相对位置

即0并不代表屏幕左上角起始点,只是保证起始位置是控件在布局中的初始位置

android:fillAfter="true" 让动画停止在结束状态的位置

android:repeatCount="3"
指定动画执行的重复次数


infinite,-1 无限次

其余数字 对应次数

android:repeatMode=""
设置动画重复执行时的重复模式


restart
默认效果


reverse 反转

-->



</translate>



代码中:

Animation anim = AnimationUtils.loadAnimation(this, R.anim.tr);

iv.startAnimation(anim);





方式二:纯代码实现

a. 通过对应的动画子类的构造方法指定要执行的动画操作

b. 通过初始化好的动画对象设置持续时间

c. 通过控件对象调用startAnimation方法开启动画



如:

/*

*
通过纯代码设置动画,常用此方法


*
参数1,3 确定起点坐标


*
参数2,4确定终点坐标


* */

//Animation
anim = new TranslateAnimation(0, 0, 0, 600);


/*

*
在原有的4个参数的基础上,给每个参数制定一个相对位置


* TranslateAnimation.ABSOLUTE
绝对值


* TranslateAnimation.RELATIVE_TO_PARENT
相对于父控件


* TranslateAnimation.RELATIVE_TO_SELF
相对于自身位置


* */

Animation
anim = new TranslateAnimation(TranslateAnimation.ABSOLUTE, 0, TranslateAnimation.ABSOLUTE, 100, TranslateAnimation.RELATIVE_TO_PARENT,
0,TranslateAnimation.RELATIVE_TO_PARENT, 0);


anim.setDuration(3000); //设置动画持续时间

anim.setRepeatCount(-1); //设置重复次数

iv.startAnimation(anim);





当想要实现多合一的动画效果时:

Xml文件中:

<!--


当有想要执行多种动画效果时,选用set作为根标签,在set标签之间添加对应的动画标签,设置对应的属性即可

-->

<!--
平移动画 -->


<translate

android:duration="3000"

android:fillAfter="true"

android:fromXDelta="0"

android:fromYDelta="0"

android:toXDelta="500"

android:toYDelta="500" />

<alpha

android:duration="3000"

android:fromAlpha="0"

android:toAlpha="1"

/>

<scale

android:duration="3000"

android:fromXScale="1"

android:fromYScale="1"

android:toXScale="2"

android:toYScale="3"

android:pivotX="10%"

android:pivotY="10%"

/>



代码中:



Animation anim = AnimationUtils.loadAnimation(this, R.anim.se);

iv.startAnimation(anim);







使用补间动画时补充:

1. 当设置了某x,y坐标有设置相对位置时,即在设置数据时,指定Animation.RELATIVE_TO_SELF或者Animation.RELATIVE_TO_PARENT
时,指定的数据最好不要超过1,因为1相当于100%


2. android:interpolator 变速器,用于指定动画执行过程速度的变化效果

如:

android:interpolator="@android:anim/linear_interpolator" 匀速运动

android:interpolator="@android:anim/bounce_interpolator" 小球效果,即移动到指定位置后有个弹力弹弹弹效果





3. 当设置多合一动画效果时,可以给动画标签指定android:startOffset属性

该属性用于指定当前动画标签要在动画开始多久之后在开始动起来



4. 可以通过动画对象调用setAnimationListener方法获取动画执行过程中的监听事件



5. 注意:补间动画有一个小的系统bug:动画只是视觉上的移动,控件的属性(真正的位置并没有进行移动),因此,即使控件执行了补间动画,动画执行后,点击事件的接收位置依然在原位置







属性动画:

Android3.0以后才出现的

效果:与补间动画实现的效果基本相同,主要区别在于,属性动画解决了补间动画的系统bug,即通过属性动画实现的控件移动,控件的位置也会一起移动





使用方式:

方式一:xml+代码

Xml文件的创建位置:
res-animator


Xml文件中:

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

android:duration="3000"

android:propertyName="translationX"

android:valueType="floatType"

android:valueFrom="0"

android:valueTo="500"

>



<!--


android:propertyName
指定要执行的动画的属性名称,即指定要执行那种动画


android:valueType
用于指定稍后再设置起始值和终止值时是否能够传递小数值


android:valueFrom=""
动画起始状态的值


android:valueTo=""
动画终止状态的值


-->

</objectAnimator>



所有可支持的动画属性名称

translationX

水平方向平移

translationY

垂直方向平移

rotation

围绕图片中心进行平面旋转

rotationX

围绕X轴进行旋转

rotationY

围绕Y轴进行旋转

scaleX

对宽度进行缩放

scaleY

对高度进行缩放

alpha

透明度改变



代码中:

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

//设置动画的执行目标,即由哪个控件执行此动画

ani.setTarget(iv);

ani.start();





方式二:纯代码

/*

*
通过纯代码方式实现属性动画:


*
参数:


* 1:设置动画的执行目标

* 2:设置要执行的动画名称

* 3:可变参数。用于指定动画的起始值和终止值

* */

Animator
ani = ObjectAnimator.ofFloat(iv,
"translationY", 0,500);


ani.setDuration(3000);

ani.start();





多合一效果的实现:

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

android:ordering="sequentially"

>

<!--


android:ordering="sequentially"
用于控制多个动画之间的执行效果


sequentially 依次排队执行

together 同时执行

-->



<objectAnimator

android:propertyName="rotation"

android:valueType="floatType"

android:valueFrom="0"

android:valueTo="360"

android:repeatCount="-1"

android:duration="3000"

></objectAnimator>



<objectAnimator

android:propertyName="scaleX"

android:valueType="floatType"

android:valueFrom="0"

android:valueTo="3"

android:repeatCount="-1"

android:duration="3000"

></objectAnimator>



<objectAnimator

android:propertyName="alpha"

android:valueType="floatType"

android:valueFrom="0.1"

android:valueTo="1"

android:repeatCount="-1"

android:duration="3000"

></objectAnimator>

</set>





监听事件的设置:

//设置动画的监听事件

a.addListener(new AnimatorListener() {

//当动画开始执行时运行

@Override

public void onAnimationStart(Animator
animation) {


//
TODO Auto-generated method stub


Log.i("===",
"====== onAnimationStart");


}

//当动画重复执行时运行

@Override

public void onAnimationRepeat(Animator
animation) {


//
TODO Auto-generated method stub


Log.i("===",
"====== onAnimationRepeat");


}

//当动画执行结束时运行

@Override

public void onAnimationEnd(Animator
animation) {


//
TODO Auto-generated method stub


Log.i("===",
"====== onAnimationEnd");


}

//当动画被取消时运行,即当动画被cancel调用时运行

@Override

public void onAnimationCancel(Animator
animation) {


//
TODO Auto-generated method stub


Log.i("===",
"====== onAnimationCancel");


}

});





停止属性动画:

属性动画对象.cancel();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: