码迷,mamicode.com
首页 > 移动开发 > 详细

Android属性动画(Animator)的优势

时间:2015-09-22 16:47:16      阅读:266      评论:0      收藏:0      [点我收藏+]

标签:

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坐标产生动画,这样补间动画就不能满足了。


2Tween Animation动画有四种动画操作(移动,缩放,旋转,淡入淡出),但是我们现在有个需求就是将当前View的背景色进行改变呢?抱歉Tween Animation是不能帮助我们实现的。


3:Tween Animation动画只是改变View的显示效果而已,但是不会真正的去改变View的属性,举个例子:我们现在屏幕的顶部有一个小球,然后通过补间动画让他移动到右下角,然后我们给这个小球添加了点击事件,希望位置移动到右下角的时候点击小球能的放大小球。但是点击事件是绝对不会触发的,原因是补间动画只是将该小球绘制到了屏幕的右下角,实际这个小球还是停在屏幕的顶部,所以你在右下角点击是没有任何反应的。



所以根据这些问题Google在Android3.0之后推出了一种全新的动画模式Property Animation(属性动画)。


Property Animatior(属性动画)




Android属性动画(Animator)的优势

标签:

原文地址:http://my.oschina.net/u/934459/blog/509671

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!