属性动画是一种非常棒的框架,能够使任何对象动起来。
属性动画允许我们对自己的动画进行如下一些属性的设定:
● 持续时间: 动画的持续时间。默认为300ms。
● 时间插值: 用于指定随着时间流逝,要以哪种方式计算动画属性的值。
●重复次数和行为:可以设定动画是否要循环播放或者只播放固定的次数。也可以对动画的播放行为进行一些其他的设定,例如将动画倒着播放。
●动画集:可以将一组动画打包到一起,一起(或者按一定次序)或者延迟播放。
●帧刷新延迟:用于指定多长时间对动画帧进行一次刷新。默认为10毫秒,但是实际的数值也和系统跟设备的配置有关。
属性动画和视图动画有哪些区别:
● 属性动画是针对所有Object对象的,而视图动画是针对所有View对象的。下面使他们的继承关系图:
其实Object是Java中唯一没有父类的类,而且它是所有类型的父类,所以一个Object对象可以指向任何对象,但是View就不具备这样的能力。因此,属性动画比视图动画更加通用,因为它使用于几乎所有对象。
● 视图动画只会改变动画对象的绘制位置,而并没有改变对象本身,但是属性动画改变的就是动画对象的本身。举个例子:你用视图动画让一个按钮移动,但是按钮移动后,你点击新按钮的位置不会有任何反应,因为这个按钮的“真身”还在原来没发生移动的那个位置上
属性动画的实现包括ValueAnimator类和ObjectAnimator类。
两者的区别就是前者在动画的过程中并不会实际改变动画对象的属性值(需要自己在监听器中实现对响应事件的响应代码),而后者则会非常方便的在动画过程中自动改变动画对象的属性值。
这里着重介绍ObjectAnimator的使用,因为在使用这个类的时候有一些需要特别注意的地方,我们由一个代码示例展开对这个类的使用方法的介绍:
下面的这段代码直接覆盖到主layout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ImageView
android:id="@+id/img"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/ic_launcher"
android:onClick="performAnimation" />
</RelativeLayout>
下面这段代码直接覆盖到MainActivity源码文件中即可( 别忘了把最低API Level调到11):
package com.example.testapp;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView img;
//因为ImageView没有合适的setWidth和getWidth,所以创建一个类来帮忙实现这两个方法
class ImageWrapper {
private View view;
ImageWrapper(View view) {
this.view = view;
}
// 人为的给ImageView类加上可用的setWidthh()方法
public void setWidth(int width) {
this.view.getLayoutParams().width = width;
this.view.requestLayout();
}
// 人为的给ImageView类加上可用的getWidthh()方法
public int getWidth() {
return this.view.getLayoutParams().width;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img = (ImageView) findViewById(R.id.img);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void performAnimation(View view) {
ImageWrapper imgwrp = new ImageWrapper(img);
// ofInt中的 "width" 就是要变化的属性,
// imgwrp这个对象一定要有 setWidth()和getWitdh()方法才可以哦
ObjectAnimator.ofInt(imgwrp, "width", 120).setDuration(5000).start();
}
}
这段代码可以直接复制粘贴,编译运行都应该没有问题。
代码中启动动画的部分就是
ObjectAnimator.ofInt(imgwrp, "width", 120).setDuration(5000).start();
这一句代码。
其中的"width"就是我们的动画对象要改变的属性。但是千万要注意这个动画对象是否具有getWidth(...)和setWidth(...)方法,如果有了这些方法,还要注意他们的作用是否就是我们想要实现的那种效果。类似的,如果你要改变属性值"x",那么动画对象就应该具有getX(...)和getY(...)方法。
也就是说,你想改变哪个名字叫XXX的属性,那么你要动画的对象就应该具有setXXX()方法和getXXX方法。
可以看看这位前辈的博文,相信看完高手的讲解,你能更加了解属性动画:
如果转载请注明出处:http://blog.csdn.net/gophers/article/details/25918319