自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方法,都可以用屬性動畫來隨時間改變其屬性。