自Android3.0以来,推出了属性动画的动画机制,遍览众多安卓教材,大多对动画机制重点讲解还集中在帧动画和补间动画上,对属性动画要么没提要么简单带过。其实据本人应用发现,属性动画不仅可以实现帧动画和补间动画,还可以实现非view对象的动画。下面是写的三种实现的demo,布局如下——
点击旋转会旋转最上面的textview,点击图片会播放小狗的动画,点击Button会改变自定义的抽象类的属性。
对应的代码如下:
public class AnimatorDemo extends Activity {
TextView textView;
ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
textView=(TextView) findViewById(R.id.textView1);
img=(ImageView) findViewById(R.id.imageView1);
}
public void swirl(View v){
ObjectAnimator objAnimator=ObjectAnimator.ofFloat(textView, "rotation", 0,360);
objAnimator.setDuration(2000);
objAnimator.setRepeatCount(10);
objAnimator.setInterpolator(new LinearInterpolator());
objAnimator.start();
}
public void frame(View v){
ObjectAnimator objectAnimator=ObjectAnimator.ofInt(img, "imageResource", R.drawable.img1,R.drawable.img13);
objectAnimator.setDuration(1500);
objectAnimator.setRepeatCount(ObjectAnimator.INFINITE);
objectAnimator.setInterpolator(new LinearInterpolator());
objectAnimator.start();
}
public void fall(View v){
final Ball ball=new Ball();
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(ball, "speed", 0,10,0);
objectAnimator.setDuration(2000);
objectAnimator.setInterpolator(new LinearInterpolator());
objectAnimator.start();
new Thread(){
public void run() {
try {
for(int i=0;i<30;i++){
Thread.sleep(100);
Log.d("speed of ball", String.valueOf(ball.getSpeed()));
}
} catch (InterruptedException e) {
Log.e("interupted", e.getLocalizedMessage());
}
};
}.start();
}
}
第三个方法中用到的实体类代码极其简单,一个属性一对set和get方法而已
public class Ball {
private float speed;
public float getSpeed() {
return speed;
}
public void setSpeed(float speed) {
this.speed = speed;
}
}
第三个抽象动画的log结果:
如此可见,属性动画抽象出的本质是随着时间改变对象属性。所以只要提供一个对象一对get和set方法,都可以用属性动画来随时间改变其属性。