`
倾城一屁
  • 浏览: 75267 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

【转】动画的两种实现模式Animation

阅读更多

关于动画的实现,Android提供了Animation,在Android SDK介绍了2种Animation模式:

1. Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画;

2. Frame Animation:顺序播放事先做好的图像,是一种画面转换动画。

动画类型

下面先来看看Android提供的动画类型。Android的animation由四种类型组成

在XML文件中:

  • alpha        渐变透明度动画效果
  • scale        渐变尺寸伸缩动画效果
  • translate  画面转换位置移动动画效果
  • rotate      画面转移旋转动画效果

在Java 源码中定义了相应的类,可以使用这些类的方法来获取和操作相应的属性:

  • AlphaAnimation渐变透明度动画效果
  • ScaleAnimation渐变尺寸伸缩动画效果
  • TranslateAnimation画面转换位置移动动画效果
  • RotateAnimation画面转移旋转动画效果

image

Tween Animation

一个tween动画将对视图对象中的内容进行一系列简单的转换(位置,大小,旋转,透明性)。如果你有一个文本视图对象,你可以移动它,旋转它,让它变大或让它变小,如果文字下面还有背景图像,背景图像也会随着文件进行转换。

使用XML来定义Tween Animation

动画的XML文件在工程中res/anim目录,这个文件必须包含一个根元素,可以使<alpha><scale> <translate> <rotate>插值元素或者是把上面的元素都放入<set>元素组中,默认情况下,所以的动画指令都是同时发生的,为了让他们按序列发生,需要设置一个特殊的属性startOffset。动画的指令定义了你想要发生什么样的转换,当他们发生了,应该执行多长时间,转换可以是连续的也可以使同时的。例如,你让文本内容从左边移动到右边,然后旋转180度,或者在移动的过程中同时旋转,没个转换需要设置一些特殊的参数(开始和结束的大小尺寸的大小变化,开始和结束的旋转角度等等,也可以设置些基本的参数(例如,开始时间与周期),如果让几个转换同时发生,可以给它们设置相同的开始时间,如果按序列的话,计算开始时间加上其周期。

Tween Animation共同的节点属性

属性[类型] 功能 备注
Duration[long] 属性为动画持续时间 时间以毫秒为单位
fillAfter [boolean] 当设置为true ,该动画转化在动画结束后被应用
fillBefore[boolean] 当设置为true ,该动画转化在动画开始前被应用

interpolator

指定一个动画的插入器 有一些常见的插入器
accelerate_decelerate_interpolator
加速-减速 动画插入器
accelerate_interpolator
加速-动画插入器
decelerate_interpolator
减速- 动画插入器
其他的属于特定的动画效果
repeatCount[int] 动画的重复次数  
RepeatMode[int] 定义重复的行为 1:重新开始  2:plays backward
startOffset[long] 动画之间的时间间隔,从上次动画停多少时间开始执行下个动画
zAdjustment[int] 定义动画的Z Order的改变 0:保持Z Order不变
1:保持在最上层
-1:保持在最下层

表二

XML节点 功能说明
alpha 渐变透明度动画效果
<alpha
android:fromAlpha=”0.1″
android:toAlpha=”1.0″
android:duration=”3000″ />
fromAlpha

属性为动画起始时透明度

0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之间的float数据类型的数字

duration为动画持续时间,ms单位

toAlpha

属性为动画结束时透明度

表三

scale 渐变尺寸伸缩动画效果
<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″ />
fromXScale[float] fromYScale[float] 为动画起始时,X、Y坐标上的伸缩尺寸 0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
toXScale [float]
toYScale[float]
为动画结束时,X、Y坐标上的伸缩尺寸
pivotX[float]
pivotY[float]
为动画相对于物件的X、Y坐标的开始位置 属性值说明:从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置
       

表四

translate 画面转换位置移动动画效果
<translate
android:fromXDelta=”30″
android:toXDelta=”-80″
android:fromYDelta=”30″
android:toYDelta=”300″
android:duration=”2000″ />
fromXDelta
toXDelta
为动画、结束起始时 X坐标上的位置  
fromYDelta
toYDelta
为动画、结束起始时 Y坐标上的位置  
       

表五

rotate 画面转移旋转动画效果
<rotate
android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
android:fromDegrees=”0″
android:toDegrees=”+350″
android:pivotX=”50%”
android:pivotY=”50%”
android:duration=”3000″ />
fromDegrees 为动画起始时物件的角度 说明
当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)
(负数from——to负数:逆时针旋转)
(正数from——to正数:顺时针旋转)
(正数from——to负数:逆时针旋转)
toDegrees 属性为动画结束时物件旋转的角度 可以大于360度
pivotX
pivotY
为动画相对于物件的X、Y坐标的开始位 说明:以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置

下面给出一个完整的XML定义(SDK提供)

<set android:shareInterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android">
   <scale
          android:interpolator="@android:anim/accelerate_decelerate_interpolator"
          android:fromXScale="1.0"
          android:toXScale="1.4"
          android:fromYScale="1.0"
          android:toYScale="0.6"
          android:pivotX="50%"
          android:pivotY="50%"
          android:fillAfter="false"
          android:duration="700" />
   <set android:interpolator="@android:anim/decelerate_interpolator">
      <scale
             android:fromXScale="1.4" 
             android:toXScale="0.0"
             android:fromYScale="0.6"
             android:toYScale="0.0" 
             android:pivotX="50%" 
             android:pivotY="50%" 
             android:startOffset="700"
             android:duration="400" 
             android:fillBefore="false" />
      <rotate 
             android:fromDegrees="0" 
             android:toDegrees="-45"
             android:toYScale="0.0" 
             android:pivotX="50%" 
             android:pivotY="50%"
             android:startOffset="700"
             android:duration="400" />
   </set>
</set>

Tween Animation如何使用

使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件

//main.xml中的ImageView
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
//加载动画
Animation hyperspaceJumpAnimation =AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
//使用ImageView显示动画
spaceshipImage.startAnimation(hyperspaceJumpAnimation);

如何在Java代码中定义动画

//在代码中定义 动画实例对象 

private Animation myAnimation_Alpha; 

private Animation myAnimation_Scale; 

private Animation myAnimation_Translate; 

private Animation myAnimation_Rotate; 

    //根据各自的构造方法来初始化一个实例对象 

myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f); 

myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f, 

             Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 

myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f); 

myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,

 Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);

interpolator的解释

interpolator定义一个动画的变化率(the rate of change)。这使得基本的动画效果(alpha, scale, translate, rotate)得以加速,减速,重复等。

 

 

AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始减速
LinearInterpolator 在动画的以均匀的速率改变

 

 

Frame Animation

Frame Animation是顺序播放事先做好的图像,跟电影类似。不同于animation package, Android SDK提供了另外一个类AnimationDrawable来定义、使用Frame Animation。

Frame Animation可以在XML Resource定义(还是存放到res\anim文件夹下),也可以使用AnimationDrawable中的API定义。由于Tween Animation与Frame Animation有着很大的不同,因此XML定义的格式也完全不一样,其格式是:首先是animation-list根节点,animation-list根节点中包含多个item子节点,每个item节点定义一帧动画,当前帧的drawable资源和当前帧持续的时间。下面对节点的元素加以说明: 

XML属性 说明
drawable 当前帧引用的drawable资源
duration 当前帧显示的时间(毫秒为单位)
oneshot 如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。
variablePadding If true, allows the drawable’s padding to change based on the current state that is selected.
visible 规定drawable的初始可见性,默认为flase;

 

 

下面就给个具体的XML例子,来定义一帧一帧的动画:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>

上面的XML就定义了一个Frame Animation,其包含3帧动画,3帧动画中分别应用了drawable中的3张图片:rocket_thrust1,rocket_thrust2,rocket_thrust3,每帧动画持续200毫秒。

然后我们将以上XML保存在res/anim/文件夹下,命名为rocket_thrust.xml,显示动画的代码:

AnimationDrawable rocketAnimation;

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
  rocketImage.setBackgroundResource(R.anim.rocket_thrust);
  rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
}

public boolean onTouchEvent(MotionEvent event) {
  if (event.getAction() == MotionEvent.ACTION_DOWN) {
    rocketAnimation.start();
    return true;
  }
  return super.onTouchEvent(event);
}

 

代码运行的结果:3张图片按照顺序的播放一次.

有一点需要强调的是:启动Frame Animation动画的代码rocketAnimation.start();不能在OnCreate()中,因为在OnCreate()中AnimationDrawable还没有完全的与ImageView绑定,在OnCreate()中启动动画,就只能看到第一张图片。这里实在拖曳事件中实现的。

下面,阅读Android SDK中对AnimationDrawable的介绍,有个简单的了解:

 

 

AnimationDrawable

获取、设置动画的属性  
int getDuration() 获取动画的时长
int getNumberOfFrames() 获取动画的帧数
boolean isOneShot()

 

Void setOneShot(boolean oneshot)

获取oneshot属性
设置oneshot属性
void inflate(Resurce r,XmlPullParser p,
AttributeSet attrs)
 
增加、获取帧动画
Drawable getFrame(int index) 获取某帧的Drawable资源
void addFrame(Drawable frame,int duration) 为当前动画增加帧(资源,持续时长)
动画控制
void start() 开始动画
void run() 外界不能直接掉调用,使用start()替代
boolean  isRunning() 当前动画是否在运行
void stop() 停止当前动画

 

本文参考:Android SDK

               moandroid.com

                eoeandroid.com

作者:Feisky
出处:http://www.cnblogs.com/feisky/

分享到:
评论

相关推荐

    补间动画的两种实现方式

    这两种方法各有优势,可以根据项目需求灵活选择。 首先,我们来看Java实现方式。在Java中,补间动画主要通过`Animation`类及其子类来实现。`Animation`类是所有动画的基础,它定义了动画的基本属性,如持续时间、...

    继承Animation自定义动画

    `Animation`有两种主要类型:补间动画(Tween Animation)和帧动画(Frame Animation)。补间动画主要用于改变对象的位置、大小、旋转等属性,而帧动画则是播放一系列静态图像来创建连续的视觉效果。 二、自定义...

    圆形循环旋转动画Animation

    首先,要实现这样的动画,我们需要了解Android中的两种主要动画类型:补间动画(Tween Animation)和帧动画(Frame Animation)。由于"圆形循环旋转"涉及到物体在路径上的运动,我们通常会使用补间动画中的旋转动画...

    动画 线程 花瓣飘落的效果 animation

    Android支持两种主要的动画类型:属性动画(Property Animation)和视图动画(View Animation)。属性动画在API 11及以上版本引入,提供了更强大的功能,如3D效果、实时更新和动画交互。视图动画则相对简单,适用于...

    Android动画效果--渐变动画

    本文将深入探讨四种主要的渐变动画:Alpha(透明度)、Scale(缩放)、Translate(平移)和Rotate(旋转),以及如何通过Java代码和XML两种方式来实现这些动画。 1. **Alpha渐变动画**: Alpha动画主要用于改变...

    animation Tween 动画

    Tween动画,又称为补间动画,是Android提供的两种基本动画类型之一(另一种是帧动画)。本文将深入探讨Tween动画,包括其原理、实现方式以及如何在实际项目中应用。 Tween动画的核心概念是通过在一段时间内改变一个...

    Animation动画基础.pdf

    Android动画模式分为两种: 1. **Tweened Animation(渐变动画)**:这类动画不涉及视图帧的更新,而是通过改变视图的状态(如位置、尺寸、透明度等)来达到动画效果。可以通过以下方式实现: - **XML**:通过在...

    03_Layout Animation 布局动画Demo下载

    布局动画主要分为两种类型:进入动画和退出动画。进入动画是指视图首次出现在屏幕上的动画,而退出动画则是视图从屏幕上消失时的动画。Android SDK提供了内置的布局动画资源,同时也支持开发者自定义动画。 1. 使用...

    css 3 动画实实现点赞动画

    `animation`属性接受多个值,如动画名称、持续时间、延迟、填充模式等。例如: ```css .like-button { animation: like-animation 0.5s ease-in-out forwards; } ``` 这里,`.like-button`是点赞按钮的类名...

    swift-Swift实现的超酷的碎纸机动画包含2种模式纸条和纸片;

    这个项目包含了两种碎纸机模式:纸条模式和纸片模式,为用户提供了丰富的视觉反馈。 首先,我们来看一下“Swift开发-动画库”这个标签。这表明该项目是基于Swift构建的一个动画库,开发者可以将其集成到自己的iOS、...

    Android中补间动画TweenAnimation

    4. **repeatMode**:重复模式,定义了动画在达到终点后如何返回起点,有两种模式:RESTART(重新开始)和REVERSE(反向播放)。 **使用方法** 1. **加载动画**:通过`AnimationUtils.loadAnimation()`方法从XML...

    微信手风琴两种模式全部显示只显示当前

    在描述中提到的"gif展示在博客里",可能是为了更直观地演示这两种模式的效果,通过动态图的形式向读者展示其工作原理和交互过程。博客链接(https://mp.csdn.net/console/editor/html/104573891)可能提供了更详细的...

    android翻转动画

    在Android SDK中,提供了两种主要的动画类型:补间动画(Tween Animation)和帧动画(Frame Animation)。这里我们关注的是补间动画,特别是` RotateAnimation `类,它是实现翻转效果的主要工具。 1. **创建 ...

    Animation的基础使用

    在Android开发中,动画...在提供的`MyAnimation`文件中,可能包含了实现这两种动画的示例代码和资源。通过学习和理解这些示例,开发者能够更好地掌握Android中的动画机制,从而提升应用程序的视觉吸引力和用户体验。

    Android动画实现轮盘效果

    Android支持两种类型的动画:属性动画(Property Animation)和视图动画(View Animation)。属性动画是Android 3.0(API level 11)引入的新特性,它可以改变对象的任意属性并随着时间推移更新这些属性。视图动画则...

    swift-四个自定义转场动画的demo

    除了上述两种情况,你还可以在自定义的容器控制器(如TabBarController或SplitViewController)中实现自定义转场。这通常涉及重写`transitionFromViewController(_:to:animated:completion:)`和`...

    使用Animation中的Camera构造伪3D动画效果(水平翻转 翻页)

    本文将深入探讨如何使用`Animation`类中的`Camera`来构建一种伪3D动画效果,具体是水平翻转和翻页效果。这种技术可以应用于各种场景,如电子书应用的翻页效果或者卡片式UI的翻转展示。 首先,我们需要理解`...

    两球旋转动画效果

    在Android中,有两种主要的动画类型:属性动画(Property Animation)和视图动画(View Animation)。两球旋转动画可能基于这两种类型的其中之一,或者是它们的结合。属性动画系统是Android 3.0(API级别11)引入的...

    Animation

    Android动画主要包括两种类型:属性动画(Property Animation)和视图动画(View Animation)。属性动画系统是在Android 3.0(API级别11)引入的,它允许开发者对对象的任意属性进行动画处理,而不仅仅是视图层次。...

    安卓开发-animation的结合蝴蝶飞的动画,使用动画里面的几种类型.zip.zip

    Android提供了两种主要的动画机制:属性动画(Property Animation)和视图动画(View Animation)。视图动画在API 11之前是主要的动画方式,它不改变视图的实际位置,只影响屏幕显示。而属性动画在API 11及更高版本...

Global site tag (gtag.js) - Google Analytics