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();
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();
相关文章推荐
- Android_聊天软件_加好友_与服务器交互
- Android】保存Fragment切换状态
- 关于Android的.so文件你所需要知道的
- 浅谈Android屏幕和语言的适配
- Android开发中OnTouchListener接口的返回值问题
- Android抽象布局——include、merge 、ViewStub
- Android项目依赖多个项目,它们的jar包冲突的解决办法
- android压缩字符串java.util.zip.DataFormatException: stream error
- android之merge布局
- learning android
- 优化Android Studio/Gradle构建
- Android Studio插件参考地址
- 安卓日记——神器AndroidAutoLayout
- Android 修改关机充电动画
- 遍历给定目录并将特定文件的名字写入文件
- Android简易实战教程--第六话《开发一键锁屏应用2·完成》
- Android简易实战教程--第六话《开发一键锁屏应用2·完成》
- Android Studio导入jar包做为系统包的方法
- Android官方开发文档Training系列课程中文版:创建自定义View之View的绘制
- android中需要牢记的单词(java篇)