标签:
Android起初有两种动画:Frame Animation(逐帧动画) Tween Animation(补间动画),但是在用的时候发现这两种动画有时候并不能满足我们的一些需要,所以Google在Androi3.0的时候推出了(Property Animation)属性动画,至于为什么前边的两种动画不能满足我们的需要,请往下看:
Frame Animation(逐帧动画)
逐帧动画就是UI设计多张图片组成一个动画,然后将它们组合链接起来进行动画播放。
该方式类似于早期电影的制作原理:具体实现方式就不多说了,你只需要让你们的UI出多张图片,然后你顺序的组合就可以(前提是UI给您做图)
Tween Animation(补间动画)
Tween Animation:是对某个View进行一系列的动画的操作,包括淡入淡出(Alpha),缩放(Scale),平移(Translate),旋转(Rotate)四种模式
咱们用一个列子来说明这种方式:
eg:首先我们重建一个项目,然后写一个xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="click" android:background="@drawable/ic_launcher" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:onClick="move" android:text="Move" /> </RelativeLayout>
注:这个XML我们后边还会一直用到
接着我们需要在我们的Activity中加入代码
package com.example.animator1; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.view.animation.TranslateAnimation; import android.widget.Toast; public class Animator1Activity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_animator1); } public void click(View view){ Toast.makeText(getApplicationContext(), "clicked", Toast.LENGTH_SHORT).show(); } @SuppressLint("NewApi") public void move(View view){ TranslateAnimation animation = new TranslateAnimation(0, 500, 0, 0); animation.setDuration(1000); animation.setFillAfter(true); //当动画停止后就会停留在动画结束的位置 ImageView imageView = (ImageView) findViewById(R.id.image); imageView.startAnimation(animation); } }
然后我们运行我们的代码会发现,我们的动画运行都没问题,但是出现了一个问题,那就是我们的click事件,在动画位置移动之前我们点击ImageView是会打印出“clicked”,但是当我们在动画位置移动之后再次点击ImageView,发现“clicked”不打印了,但是我们点击原先ImageView动画移动之前的位置会发现点击事件又是可以,从这我们就可以得出一个结论:传统的Animation动画并不适用于做进行动画交互的效果,而且Animation动画的效果是重复调用我们的Ondraw方法进行重绘,这样会存在内存,性能的一些问题。
我们可以得出Tween Animation(补间动画)的一些缺点:
1:Tween Animation(补间动画)只是针对于View,超脱了View就无法操作了,这句话的意思是:假如我们需要对一个Button,ImageView,LinearLayout或者是其他的继承自View的各种组件进行动画的操作时,Tween Animation是可以帮我们完成我们需要完成的功能的,但是如果我们需要用到对一个非View的对象进行动画操作的话,那么补间动画就没办法实现了。举个例子:比如我们有一个自定义的View,在这个View中有一个Point对象用于管理坐标,然后在onDraw()方法中的坐标就是根据该Pointde坐标值进行绘制的。也就是说,如果我们可以对Point对象进行动画操作,那么整个自定义的View,那么整个自继承View的当前类就都有了动画,但是我们的目的是不想让View有动画,只是对动画中的Point坐标产生动画,这样补间动画就不能满足了。
2:Tween Animation动画有四种动画操作(移动,缩放,旋转,淡入淡出),但是我们现在有个需求就是将当前View的背景色进行改变呢?抱歉Tween Animation是不能帮助我们实现的。
3:Tween Animation动画只是改变View的显示效果而已,但是不会真正的去改变View的属性,举个例子:我们现在屏幕的顶部有一个小球,然后通过补间动画让他移动到右下角,然后我们给这个小球添加了点击事件,希望位置移动到右下角的时候点击小球能的放大小球。但是点击事件是绝对不会触发的,原因是补间动画只是将该小球绘制到了屏幕的右下角,实际这个小球还是停在屏幕的顶部,所以你在右下角点击是没有任何反应的。
所以根据这些问题Google在Android3.0之后推出了一种全新的动画模式Property Animation(属性动画)。
Property Animatior(属性动画)
标签:
原文地址:http://my.oschina.net/u/934459/blog/509671