动画animation

一、分类:
(一)、概要:
3.0以前,android支持两种动画模式,补间动画(tween animation),帧动画(frame animation),在android3.0中又引入了一个新的动画系统:属性动画(property animation)。
这三种动画模式在SDK中被称为 view animation,drawable animation,property animation。

(二)、动画资源分类:
  1. 属性动画:Property Animation
  2. 帧动画:Frame Animation (Drawable Animation)
  3. 补间动画: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只是表示一个值在一段时间内的改变,当值改变时要做什么事情完全是你自己决定的。

(二)、常用属性:
  1. Duration动画的持续时间,默认300ms。android:duration属性
  2. Time interpolation:时间插值。LinearInterpolator、AccelerateDecelerateInterpolator,定义动画的变化率。android:interpolator属性
  3. Repeat count and behavior:重复次数、以及重复模式;可以定义重复多少次;重复时从头开始,还是反向。android:repeatCount属性
  4. Animator sets: 动画集合,你可以定义一组动画,一起执行或者顺序执行。<set/>,该元素的android:ordering属性指定该组动画是按次序播放还是同时播放。
  5. Frame refresh delay:帧刷新延迟(帧刷新频率,每个多久播放一帧);默认为10ms,但最终依赖系统的当前状态。
(三)、属性动画API:相关的类
  1. ObjectAnimator 动画的执行类(是ValueAnimator的子类,使用简单常用。少数场景下,由于其存在一些限制,再考虑使用ValueAnimator)
  2. ValueAnimator 动画的执行类
  3. AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
  4. AnimatorInflater 用户加载属性动画的xml文件
  5. TypeEvaluator 类型估值,主要用于设置动画操作属性的值。
  6. 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倍,保持结束时的状态)
派生到我的代码片
派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <rotate xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:interpolator="@android:anim/accelerate_decelerate_interpolator"
  4. android:fromDegrees="0"
  5. android:toDegrees="360"
  6. android:pivotX="50%"
  7. android:pivotY="50%"
  8. android:duration="700"
  9. android:fillAfter="true"
  10. />
AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速

AccelerateInterpolator DecelerateInterpolator
在动画开始的地方速率改变比较慢,然后开始加速 在动画开始的地方快然后慢
AnticipateInterpolator AnticipateOvershootInterpolator
开始的时候向后然后向前甩 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator CycleInterpolator
动画结束的时候弹起 动画循环播放特定的次数,速率改变沿着正弦曲线
LinearInterpolator OvershootInterpolator
以常量速率改变 向前甩一定值后再回到原来位置
四、alpha标签
下面先看看alpha标签应用插值器后,都会变成什么样。
将透明度从0变成1.0,使用不同的插值器看看有什么不同(因为只是透明度的变化,所以基本看不出来有什么不同)
派生到我的代码片
派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <alpha xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:interpolator="@android:anim/accelerate_decelerate_interpolator"
  4. android:fromAlpha="0.0"
  5. android:toAlpha="1.0"
  6. android:duration="3000"
  7. android:fillAfter="true"
  8. />
AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速

AccelerateInterpolator DecelerateInterpolator
在动画开始的地方速率改变比较慢,然后开始加速 在动画开始的地方快然后慢
AnticipateInterpolator AnticipateOvershootInterpolator
开始的时候向后然后向前甩 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator CycleInterpolator
动画结束的时候弹起 动画循环播放特定的次数,速率改变沿着正弦曲线
LinearInterpolator OvershootInterpolator
以常量速率改变 向前甩一定值后再回到原来位置
五、translate标签
下面先看看translate标签应用插值器后,都会变成什么样。
把控件从(0,0)平移到(-200,-200)的位置,保持结束时状态不变,使用不同插值器。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <translate xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:interpolator="@android:anim/accelerate_decelerate_interpolator"
  4. android:fromXDelta="0"
  5. android:toXDelta="-200"
  6. android:fromYDelta="0"
  7. android:toYDelta="-200"
  8. android:duration="2000"
  9. android:fillAfter="true"
  10. />
AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator DecelerateInterpolator
在动画开始的地方速率改变比较慢,然后开始加速 在动画开始的地方快然后慢
AnticipateInterpolator AnticipateOvershootInterpolator
开始的时候向后然后向前甩 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator CycleInterpolator
动画结束的时候弹起 动画循环播放特定的次数,速率改变沿着正弦曲线
LinearInterpolator OvershootInterpolator
以常量速率改变 向前甩一定值后再回到原来位置


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值