一、分类:
(一)、概要:
3.0以前,android支持两种动画模式,补间动画(tween animation),帧动画(frame animation),在android3.0中又引入了一个新的动画系统:属性动画(property animation)。
这三种动画模式在SDK中被称为 view animation,drawable animation,property animation。
(二)、动画资源分类:
- 属性动画:Property Animation
- 帧动画:Frame Animation (Drawable Animation)
- 补间动画:Tween Animation (View Animation)
- 透明度补间动画
- 缩放补间动画
- 旋转补间动画
- 移动补间动画
- 集合
- Alpha:渐变透明度动画效果
- Scale:渐变尺寸伸缩动画效果
- Translate:画面转换位置移动动画效果
- Rotate:画面转换位置移动动画效果
二、补间动画:
Tween Animation就是一系列View形状的变换,如大小的缩放、透明度的改变、水平位置的改变、旋转位置改变,动画的定义既可以用java代码定义也可以用XML定义。建议用XML定义。
用XML定义的动画放在
/res/anim
/文件夹内,XML文件的根元素为<set> , 二级节点可为<
alpha
>,<
scale
>,<
translate
>,<
rotate
>。
(一)、Tween Animation共同的属性:
1、
duration
[long] 属性为动画持续时间 时间以毫秒为单位
2、
fillAfter
[boolean] 当设置为true ,该动画转化在动画结束后被应用
3、
fillBefore
[boolean] 当设置为true ,该动画转化在动画开始前被应用
4、
interpolator
指定一个动画的插入器 有一些常见的插入器
- accelerate_decelerate_interpolator 加速-减速 动画插入器
- accelerate_interpolator 加速-动画插入器
- decelerate_interpolator 减速- 动画插入器
其他的属于特定的动画效果
5、
repeatCount
[int] 动画的重复次数
6、
repeatMode
[String] 定义重复的行为
- "restart" 、"reverse"
- eg: android:repeatMode="reverse"
7、startOffset[long] 动画之间的时间间隔,从上次动画停多少时间开始执行下个动画
8、zAdjustment[int] 定义动画的Z Order的改变 0:保持Z Order不变
1:保持在最上层
-1:保持在最下层
(二)、用xml资源实现补间动画:
<alpha
android:fromAlpha=”0.0″
android:toAlpha=”1.0″
android:duration=”3000″ />
【说明:】
1.fromAlpha:属性为动画起始时透明度
- 0.0表示完全透明
- 1.0表示完全不透明
- 以上值取0.0-1.0之间的float数据类型的数字
2.toAlpha:属性为动画结束时透明度
<scale
android:interpolator= "@android:anim/accelerate_decelerate_interpolator"
android:fromXScale=”0.0″
android:toXScale=”1.4″
android:fromYScale=”0.0″
android:toYScale=”1.4″
android:pivotX=”50%”
android:pivotY=”50%”
android:fillAfter=”false”
android:startOffset=“700”
android:duration=”700″
android:repeatCount=”10″ />
【说明:】
1.fromXScale[float]
2.fromYScale[float] 为动画起始时,X、Y坐标上的伸缩尺寸
- 0.0表示收缩到没有
- 1.0表示正常无伸缩
- 值小于1.0表示收缩
- 值大于1.0表示放大
3.toXScale [float] 为动画结束时,X坐标上的伸缩尺寸
4.toYScale[float] 为动画结束时,Y坐标上的伸缩尺寸
5.pivotX[float]
6.pivotY[float] 为动画相对于物件的X、Y坐标的开始位置
属性值说明:从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置
<translate
android:fromXDelta=”30″
android:toXDelta=”-80″
android:fromYDelta=”30″
android:toYDelta=”300″
android:duration=”2000″ />
【说明:】
1.fromXDelta
2.toXDelta 为动画结束起始时 X坐标上的位置
3.fromYDelta
4.toYDelta 为动画结束起始时 Y坐标上的位置
<rotate
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromDegrees=”0″
android:toDegrees=”+350″
android:pivotX=”50%”
android:pivotY=”50%”
android:duration=”3000″ />
【说明:】
1.fromDegrees 为动画起始时物件的角度
说明:当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)
(负数from——to负数:逆时针旋转)
(正数from——to正数:顺时针旋转)
(正数from——to负数:逆时针旋转)
2.toDegrees 属性为动画结束时物件旋转的角度 可以大于360度
3.pivotX
4.pivotY 为动画相对于物件的X、Y坐标的开始位
说明:以上两个属性值 从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置
(三)、用java代码实现补间动画:
publicclass
MainActivity
extends
Activity {
private
ImageView imageView_main;
private
Animation
animation
=
null
;
@Override
protectedvoid
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.
activity_main
);
imageView_main
= (ImageView) findViewById(R.id.
imageView_main
);
}
publicvoid
clickButton(View view) {
switch
(view.getId()) {
case
R.id.
button_main_alpha
:
animation
=
new
AlphaAnimation(0.0f, 1.0f);
break
;
case
R.id.
button_main_scale
:
animation
=
new
ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f,
Animation.
RELATIVE_TO_SELF
, 0.5f,
Animation.
RELATIVE_TO_SELF
, 1.0f);
break
;
case
R.id.
button_main_translate
:
animation
=
new
TranslateAnimation(0, 150, 0, 0);
break
;
case
R.id.
button_main_rotate
:
animation
=
new
RotateAnimation(0, 360, Animation.
RELATIVE_TO_SELF
,
0.5f, Animation.
RELATIVE_TO_SELF
, 1.0f);
break
;
default
:
break
;
}
animation
.setDuration(3000);
imageView_main.setAnimation(animation);
}
}
【注释】:
AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator 开始的时候向后然后向前甩
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator 动画结束的时候弹起
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方快然后慢
LinearInterpolator 以常量速率改变
OvershootInterpolator 向前甩一定值后再回到原来位置
参考:
三、帧动画:
Frame Animation(AnimationDrawable对象):帧动画,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果。
必须以<animation-list>为根元素,以<item>表示要轮换显示的图片,duration属性表示各项显示的时间。XML文件要放在
/res/anim
/或者/
res/animator
目录下。
(一)、实例代码:
一、res/anim/frame_animation.xml的代码:
<
animation-list
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:oneshot
=
"true"
>
<
item
android:drawable
=
"@drawable/anim1"
android:duration
=
"50"
/>
<
item
android:drawable
=
"@drawable/anim2"
android:duration
=
"50"
/>
<
item
android:drawable
=
"@drawable/anim3"
android:duration
=
"50"
/>
<
item
android:drawable
=
"@drawable/anim4"
android:duration
=
"50"
/>
<
item
android:drawable
=
"@drawable/anim5"
android:duration
=
"50"
/>
<
item
android:drawable
=
"@drawable/anim6"
android:duration
=
"50"
/>
<
item
android:drawable
=
"@drawable/anim7"
android:duration
=
"50"
/>
<
item
android:drawable
=
"@drawable/anim8"
android:duration
=
"50"
/>
<
item
android:drawable
=
"@drawable/anim9"
android:duration
=
"50"
/>
<
item
android:drawable
=
"@drawable/anim10"
android:duration
=
"50"
/>
<
item
android:drawable
=
"@drawable/anim11"
android:duration
=
"50"
/>
<
item
android:drawable
=
"@drawable/anim12"
android:duration
=
"50"
/>
</
animation-list
>
【备注:】
drawable 当前帧引用的drawable资源
duration 当前帧显示的时间(毫秒为单位)
oneshot 如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。
二、MainActivity.java代码:
public
class
MainActivity
extends
Activity {
private
ImageView
imageView_main_show
;
private
AnimationDrawable
animationDrawable
=
null
;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.
activity_main
);
imageView_main_show
= (ImageView) findViewById(R.id.
imageView_main_show
);
imageView_main_show
.setBackgroundResource(R.anim.
frame_animation
);
animationDrawable
= (AnimationDrawable)
imageView_main_show.getBackground();
}
public
void
clickButton(View view) {
switch
(view.getId()) {
case
R.id.
button_main_start
:
if
(!
animationDrawable
.isRunning()) {
//一组动画是否只播放一次
animationDrawable
.setOneShot(
false
);
animationDrawable
.start();
}
break
;
case
R.id.
button_main_stop
:
if
(
animationDrawable
.isRunning()) {
animationDrawable
.stop();
}
break
;
}
}
@Override
public
void
onWindowFocusChanged(
boolean
hasFocus) {
super
.onWindowFocusChanged(hasFocus);
if
(!
animationDrawable
.isRunning()) {
animationDrawable
.setOneShot(
false
);
animationDrawable
.start();
}
}
}
【备注:】
SDK中提到,不要在onCreate()中调用start(),因为AnimationDrawable还没有完全跟Window相关联,如果想要界面显示时就开始动画的话,可以在
onWindowFoucsChanged
()中调用
start
()。
四、属性动画:
(一)、概念:
属性动画,这个是在
Android 3.0
中才引进的。Property Animation故名思议就是通过动画的方式改变对象的属性.属性动画更改的是对象的实际属性,在View Animation(Tween Animation)中,其改变的是
View的绘制效果,真正的View的属性保持不变
。可以将属性动画理解为
增强版的补间动画
。
比如无论如何缩放Button的大小,Button的有效点击区域还是没有应用动画时的区域,其位置与大小都不变。而在Property Animation中,改变的是对象的实际属性,如Button的缩放,Button的位置与大小属性值都改变了。
Property Animation不止可以应用于View,还可以应用于任何对象。Property Animation只是表示一个值在一段时间内的改变,当值改变时要做什么事情完全是你自己决定的。
(二)、常用属性:
- Duration动画的持续时间,默认300ms。android:duration属性
- Time interpolation:时间插值。LinearInterpolator、AccelerateDecelerateInterpolator,定义动画的变化率。android:interpolator属性
- Repeat count and behavior:重复次数、以及重复模式;可以定义重复多少次;重复时从头开始,还是反向。android:repeatCount属性
- Animator sets: 动画集合,你可以定义一组动画,一起执行或者顺序执行。<set/>,该元素的android:ordering属性指定该组动画是按次序播放还是同时播放。
- Frame refresh delay:帧刷新延迟(帧刷新频率,每个多久播放一帧);默认为10ms,但最终依赖系统的当前状态。
(三)、属性动画API:相关的类
- ObjectAnimator 动画的执行类(是ValueAnimator的子类,使用简单常用。少数场景下,由于其存在一些限制,再考虑使用ValueAnimator)
- ValueAnimator 动画的执行类
- AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
- AnimatorInflater 用户加载属性动画的xml文件
- TypeEvaluator 类型估值,主要用于设置动画操作属性的值。
- TimeInterpolator 时间插值
- 总的来说,属性动画就是,动画的执行类来设置动画操作的对象的属性、持续时间,开始和结束的属性值,时间差值等,然后系统会根据设置的参数动态的变化对象的属性。
(一)、实例代码:
一、res/anim/property_anim.xml的代码:
<
set
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:ordering
=
"sequentially"
>
<
objectAnimator
android:duration
=
"4000"
android:propertyName
=
"x"
android:valueTo
=
"300"
android:valueType
=
"intType"
/>
<
objectAnimator
android:duration
=
"4000"
android:propertyName
=
"y"
android:valueTo
=
"400"
android:valueType
=
"intType"
/>
<
objectAnimator
android:duration
=
"4000"
android:propertyName
=
"x"
android:valueTo
=
"0"
android:valueType
=
"intType"
/>
<
objectAnimator
android:duration
=
"4000"
android:propertyName
=
"y"
android:valueTo
=
"0"
android:valueType
=
"intType"
/>
</
set
>
二、MainActivity.java代码:
publicclass
MainActivity
extends
Activity {
private
ImageView
imageView_main_obj
;
private
Move
move
;
@Override
publicvoid
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.
activity_main
);
imageView_main_obj
= (ImageView) findViewById(R.id.
imageView_main_obj
);
move
=
new
Move();
imageView_main_obj
.setOnClickListener(
new
OnClickListener() {
@Override
publicvoid
onClick(View v) {
setTitle(
move
.getX() +
":"
+
move
.getY());
}
});
}
class
Move {
privateint
y
;
privateint
x
;
publicint
getY() {
return
y
;
}
publicvoid
setY(
int
y) {
this
.
y
= y;
imageView_main_obj
.layout(
imageView_main_obj
.getLeft(), y,
imageView_main_obj
.getRight(),
y +
imageView_main_obj
.getMeasuredHeight());
}
publicint
getX() {
return
x
;
}
publicvoid
setX(
int
x) {
this
.
x
= x;
imageView_main_obj
.layout(x,
imageView_main_obj
.getTop(), x
+
imageView_main_obj
.getMeasuredWidth(),
imageView_main_obj
.getBottom());
}
}
publicvoid
clickButton(View view) {
// 装载属性动画资源
AnimatorSet set = (AnimatorSet) AnimatorInflater.
loadAnimator
(
this
,
R.animator.
property_anim
);
// 设置要控制的对象
set.setTarget(
move
);
// 开始动画
set.start();
}
}
【备注说明:】
<
objectAnimator
android:duration
=
"4000"
android:propertyName
=
"x"
android:valueTo
=
"300"
android:valueType
=
"intType"
/>
【备注:】
- android:ordering说明一系列动画动作的执行顺序,有两个选择: sequentially 和together,顺序执行还是一起执行;
- objectAnimator 是设定动画实施的对象;
- duration是该动画动作执行从开始到结束所用的时间;
- android:repeatCount="infinite" 可以是整数或者infinite
- android:repeatMode="restart" 可以是restart 或者 reverse
- android:valueFrom=" " 整数|浮点数|颜色
二、scale标签
下面先看看Scale标签应用插值器后,都会变成什么样。
先看下XML代码:(从控件中心点,从0放大到1.4倍,保持结束时的状态)
<?xml version="1.0" encoding="utf-8"?><scale xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="0.0" android:toXScale="1.4" android:fromYScale="0.0" android:toYScale="1.4" android:pivotX="50%" android:pivotY="50%" android:duration="700" android:fillAfter="true"/>
下面一个个看看,每个xml值对应的scale动画是怎样的。
AccelerateInterpolator DecelerateInterpolator
在动画开始的地方速率改变比较慢,然后开始加速 在动画开始的地方快然后慢
AnticipateInterpolator AnticipateOvershootInterpolator
开始的时候向后然后向前甩 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator CycleInterpolator
动画结束的时候弹起 动画循环播放特定的次数,速率改变沿着正弦曲线
LinearInterpolator OvershootInterpolator
以常量速率改变 向前甩一定值后再回到原来位置
三、rotate标签
下面先看看rotate标签应用插值器后,都会变成什么样。
先看下XML代码:(从控件中心点,从0放大到1.4倍,保持结束时的状态)
[html]
view plaincopy
派生到我的代码片
- <?xml version="1.0" encoding="utf-8"?>
- <rotate xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/accelerate_decelerate_interpolator"
- android:fromDegrees="0"
- android:toDegrees="360"
- android:pivotX="50%"
- android:pivotY="50%"
- android:duration="700"
- android:fillAfter="true"
- />
AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator DecelerateInterpolator
在动画开始的地方速率改变比较慢,然后开始加速 在动画开始的地方快然后慢
AnticipateInterpolator AnticipateOvershootInterpolator
开始的时候向后然后向前甩 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator CycleInterpolator
动画结束的时候弹起 动画循环播放特定的次数,速率改变沿着正弦曲线
LinearInterpolator OvershootInterpolator
以常量速率改变 向前甩一定值后再回到原来位置
四、alpha标签
下面先看看alpha标签应用插值器后,都会变成什么样。
将透明度从0变成1.0,使用不同的插值器看看有什么不同(因为只是透明度的变化,所以基本看不出来有什么不同)
[html]
view plaincopy
派生到我的代码片
- <?xml version="1.0" encoding="utf-8"?>
- <alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/accelerate_decelerate_interpolator"
- android:fromAlpha="0.0"
- android:toAlpha="1.0"
- android:duration="3000"
- android:fillAfter="true"
- />
AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator DecelerateInterpolator
在动画开始的地方速率改变比较慢,然后开始加速 在动画开始的地方快然后慢
AnticipateInterpolator AnticipateOvershootInterpolator
开始的时候向后然后向前甩 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator CycleInterpolator
动画结束的时候弹起 动画循环播放特定的次数,速率改变沿着正弦曲线
LinearInterpolator OvershootInterpolator
以常量速率改变 向前甩一定值后再回到原来位置
五、translate标签
下面先看看translate标签应用插值器后,都会变成什么样。
把控件从(0,0)平移到(-200,-200)的位置,保持结束时状态不变,使用不同插值器。
- <?xml version="1.0" encoding="utf-8"?>
- <translate xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/accelerate_decelerate_interpolator"
- android:fromXDelta="0"
- android:toXDelta="-200"
- android:fromYDelta="0"
- android:toYDelta="-200"
- android:duration="2000"
- android:fillAfter="true"
- />
AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator DecelerateInterpolator
在动画开始的地方速率改变比较慢,然后开始加速 在动画开始的地方快然后慢
AnticipateInterpolator AnticipateOvershootInterpolator
开始的时候向后然后向前甩 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator CycleInterpolator
动画结束的时候弹起 动画循环播放特定的次数,速率改变沿着正弦曲线
LinearInterpolator OvershootInterpolator
以常量速率改变 向前甩一定值后再回到原来位置