Android 属性动画简介

来源:互联网 发布:奢侈品女包 知乎 编辑:程序博客网 时间:2024/06/07 10:04

在Android中动画可以分为三类,View动画,帧动画以及属性动画。View动画通过对图像进行变换(平移,缩放,旋转以及透明度)从而产生动画效果。帧动画是通过顺序播放一系列图像实现动画的效果;属性动画顾名思义是通过改变对象的属性值来实现动画效果。View动画与帧动画在使用上比属性动画稍微复杂一点,而更重要的是当我们使用View动画将控件移动到新位置时,这时控件的相应事件(如点击事件)并不能随着平移的位置而移动,控件的响应事件依然还是停留在动画开始的位置。这一点在日常的开发中是非常不方便的。

属性动画的使用主要是通过ObjectAnimator类来实现的。通过调用ObjectAnimator.ofXXX(View view, property,from,to).setDuration(time).start()来实现的。 view为需要设置属性动画的参数,property为动画的属性(如平移,旋转,透明度以及缩放),from为起始位置或开始值,to为终点位置或结束值。下面就是一个使用属性动画的简单示例,动画效果为将ImageButton控件从X轴0的起始位置移动到X轴的190位置,Y轴的0点位置移动到190位置,同时加上旋转的动画效果。

package com.vic.demo;import android.animation.ObjectAnimator;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageButton;import android.widget.Toast;public class TestActivity extends Activity{private static final String TAG = TestActivity.class.getSimpleName();private ImageButton mButton = null;private Button mClickButton = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.test_layout);mButton = (ImageButton) findViewById(R.id.test);mClickButton = (Button) findViewById(R.id.test_click);mClickButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {ObjectAnimator.ofFloat(mButton, "translationX", 0F,190F).setDuration(1000).start();ObjectAnimator.ofFloat(mButton, "translationY", 0F,190F).setDuration(1000).start();ObjectAnimator.ofFloat(mButton, "rotation", 0F,360F).setDuration(1000).start();}});mButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {Toast.makeText(TestActivity.this, "click",Toast.LENGTH_SHORT).show();}});}}

动画效果如下所示,并此时点击button也会有toast弹出。


通过上面的代码我们可以发现虽然设置不同的属性动画有先后顺序,但是运行时他们其实是一齐进行动画显示的。这是由于调用ObjectAnimator.start()时其实是使用多线程实现的,所以即使代码上的先后顺序也没有影响属性动画的同时显示。那么有没有方法可以让属性动画按照一定的顺序进行显示呢?答案是肯定的。

使用属性动画进行有顺序的显示需要用到AnimatorSet这个属性动画集合类,通过在集合中添加属性动画对象,再调用AnimatorSet.playTogether(animator1,animator2,animator3...)以及playSequentially(animator1,animator2,animator3...)来控制属性和动画是同时显示或是按照先后顺序进行显示。还是上面的例子,当我们使用AnimatorSet.playSequentitally时,实现了将控件在X轴平移到200像素,再Y轴上平移到200像素,最后旋转360°的动画。下面是实现代码

package com.vic.demo;import android.animation.AnimatorSet;import android.animation.ObjectAnimator;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.animation.AnimationSet;import android.widget.Button;import android.widget.ImageButton;import android.widget.Toast;public class TestActivity extends Activity{private static final String TAG = TestActivity.class.getSimpleName();private ImageButton mButton = null;private Button mClickButton = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.test_layout);mButton = (ImageButton) findViewById(R.id.test);mClickButton = (Button) findViewById(R.id.test_click);mClickButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {AnimatorSet set = new AnimatorSet();//属性动画集合类ObjectAnimator oa1 = ObjectAnimator.ofFloat(mButton, "translationX", 0F,200F).setDuration(1000);ObjectAnimator oa2 = ObjectAnimator.ofFloat(mButton, "translationY", 0F,200F).setDuration(1000);ObjectAnimator oa3 = ObjectAnimator.ofFloat(mButton, "rotation", 0F,360F).setDuration(1000);set.playSequentially(oa1,oa2,oa3); //按照顺序显示动画set.start();}});mButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {Toast.makeText(TestActivity.this, "click",Toast.LENGTH_SHORT).show();}});}}
另外在AnimatorSet中还有with,after等方法,可以对集合中的属性动画进行更精细的控制。
最后再介绍下属性动画的监听事件。 通过监听监听属性动画可以控制属性动画在播放过程中对各个控件的操作以及添加相关逻辑。添加监听动画也很简单,即在ObjectAnimator中调用addListener即可,添加后属性动画监听接口会覆写4个接口方法,分别监听属性动画在播放开始,播放结束,播放重复以及播放取消4个操作。详细可以看看下面的代码,在动画结束后弹出一个toast。

package com.vic.demo;import android.animation.Animator;import android.animation.Animator.AnimatorListener;import android.animation.AnimatorSet;import android.animation.ObjectAnimator;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageButton;import android.widget.Toast;public class TestActivity extends Activity{private static final String TAG = TestActivity.class.getSimpleName();private ImageButton mButton = null;private Button mClickButton = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.test_layout);mButton = (ImageButton) findViewById(R.id.test);mClickButton = (Button) findViewById(R.id.test_click);mClickButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {ObjectAnimator oa1 = ObjectAnimator.ofFloat(mButton, "translationX", 0F,200F).setDuration(1000);oa1.addListener(new AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {Toast.makeText(TestActivity.this, "Animation end",Toast.LENGTH_SHORT).show();}@Overridepublic void onAnimationCancel(Animator animation) {}});oa1.start();}});mButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {Toast.makeText(TestActivity.this, "click",Toast.LENGTH_SHORT).show();}});}}

通过以上示例我们可以看到操作属性动画还是很简单的,当然属性动画也有自己的不足之处就是在Android3.0之前是不支持的,所以要照顾Android3.0之前的版本需要引入nineoldandroids动画库进行兼容性的处理

总结下android属性动画,

     1. 通过ObjectAnimator类的ofXXX(ofFloat(....),ofAlpha(....)).setDuration().start()来启动属性动画

    2. 属性动画是并发式运行的,想要控制属性动画显示顺序可以调用AnimatorSet类来控制。

    3. 和帧动画,View动画一样可以对属性动画设置动画监听,通过监听动画播放过程中的时间可以更好的与其他View进行交互。



0 0