android 动画资源

一、分类:

(一)、概要:

        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                      向前甩一定值后再回到原来位置

 

参考:

http://blog.youkuaiyun.com/harvic880925/article/details/40049763

http://download.youkuaiyun.com/detail/harvic880925/8038491

 

三、帧动画:

        Frame Animation(AnimationDrawable对象):帧动画,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果。

        必须以<animation-list>为根元素,以<item>表示要轮换显示的图片,duration属性表示各项显示的时间。XML文件要放在/res/anim/或者/res/animator目录下。

(一)、实例代码:

一、res/anim/frame_animation.xml的代码:
 

 

<animation-listxmlns:android="http://schemas.android.com/apk/res/android"

android:oneshot="true">

<itemandroid:drawable="@drawable/anim1"android:duration="50"/>

<itemandroid:drawable="@drawable/anim2"android:duration="50"/>

<itemandroid:drawable="@drawable/anim3"android:duration="50"/>

<itemandroid:drawable="@drawable/anim4"android:duration="50"/>

<itemandroid:drawable="@drawable/anim5"android:duration="50"/>

<itemandroid:drawable="@drawable/anim6"android:duration="50"/>

<itemandroid:drawable="@drawable/anim7"android:duration="50"/>

<itemandroid:drawable="@drawable/anim8"android:duration="50"/>

<itemandroid:drawable="@drawable/anim9"android:duration="50"/>

<itemandroid:drawable="@drawable/anim10"android:duration="50"/>

<itemandroid:drawable="@drawable/anim11"android:duration="50"/>

<itemandroid: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 {

privateinty;

privateintx;

 

publicint getY() {

returny;

}

 

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() {

returnx;

}

 

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派生到我的代码片

  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,使用不同的插值器看看有什么不同(因为只是透明度的变化,所以基本看不出来有什么不同)

[html]view plaincopy派生到我的代码片

  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  

                      以常量速率改变                                向前甩一定值后再回到原来位置

   

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值