- 視圖動畫與屬性動畫的差別:
- 引入時間不同
- 所在包名不同
- 視圖動畫:android.view.animation
- 屬性動畫:android.animation
- 動畫類名不同
- 視圖動畫:XXXXAnimation
- 屬性動畫:XXXXAnimator
- 視圖動畫我們可以發現如果給TextView設定一個向下移動的效果,在給他一個點選事件,就會發現TextView移動後無法點選,是以說視圖動畫無法改變動畫屬性
public class ViewAnimationWrongActivity extends AppCompatActivity {
private Button button; private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_animation_wrong);
button = (Button)findViewById(R.id.move_text);
textView = (TextView)findViewById(R.id.text_click);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TranslateAnimation translateAnimation = new
TranslateAnimation(Animation.ABSOLUTE, 0,
Animation.ABSOLUTE,0,Animation.ABSOLUTE, 0, Animation.ABSOLUTE,400);
translateAnimation.setDuration(1000);
translateAnimation.setFillAfter(true);
textView.startAnimation(translateAnimation);
}
});
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(ViewAnimationWrongActivity.this,
textView.getText(), Toast.LENGTH_SHORT).show();
}
});
}
}
- 屬性動畫的功能:
- 對指定區間進行動畫運算,我們通過對運算過程進行監聽來操作控件
- ValueAnimator隻負責對指定區間進行動畫運算
- 我們需要對運算過程進行監聽,然後自己對控件執行動畫操作
- 初步使用ValueAnimator:
ValueAnimator valueAnimmator = ValueAnimator.ofInt(0, 400);
valueAnimator.setDuration(1000);
valueAnimator.start();
* 但是從上述的代碼可以看出ValueAnimator沒有跟任何控件進行關聯,他隻針對值進行動畫運算,而不是針對空間的
//correct
public class ViewAnimationWrongActivity extends AppCompatActivity {
private Button button;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_animation_wrong);
button = (Button)findViewById(R.id.move_text);
textView = (TextView)findViewById(R.id.text_click);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//進行屬性動畫
doAnimation();
}
});
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(ViewAnimationWrongActivity.this,
textView.getText(), Toast.LENGTH_SHORT).show();
}
});
}
private void doAnimation(){
final ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 400);
valueAnimator.setDuration(1000);
//對ValueAnimator進行監聽,并将目前的監聽結果傳回,讓TextView重新繪制,也就是将TextView的那塊畫布一起移走
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int curValue = (int) valueAnimator.getAnimatedValue();
textView.layout(0, curValue+button.getHeight(), textView.getWidth(),
curValue+textView.getHeight());
}
});
valueAnimator.start();
}
}
//都是可變長函數,是以可以傳入任何數量的值,比如ofInt(2, 90,45)從數字2變化到數字90再變化到45,傳進去的數字越多,動畫變化就越複雜,兩者傳入的資料類型不同
public static ValueAnimator ofInt(int.... values)
public static ValueAnimator ofFloat(float..... values)
- Object getAnimatedValue():
這個函數的傳回值類型通過上述的函數使用的類型進行控制,比如上述函數使用ofInt()就會傳回int類型
//設定動畫時長
ValueAnimator setDuration(long duration);
//擷取運動時點的值
Object getAnimatedValue();
//開始動畫
void start();
//設定循環次數,設定位INFINITE表示無限循環
void setRepeatCount(int value);
//設定循環模式
void setRepeatMode(int value);
//取消動畫
void cancel();
- 注意:重複次數為INFINITE的動畫,當Activity結束時,必須調用cancel()函數取消動畫,否則動畫将無限循環,進而導緻View無法釋放,最終引起記憶體洩漏
- 執行效果的監聽器:
//添加執行情況的監聽器
valueAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Log.d(TAG, "Start");
}
@Override
public void onAnimationEnd(Animator animation) {
Log.d(TAG, "End");
}
@Override
public void onAnimationCancel(Animator animation){
Log.d(TAG, "Cancel");
}
@Override
public void onAnimationRepeat(Animator animation) {
Log.d(TAG, "Repeat");
}
});
//對于每一個監聽器都有兩種方法來移除
//移除所有的監聽器
removeAllListeners();
//移除指定的監聽器
removeListener(AnimatorListener listener);
//延時多久開始,機關是毫秒
public void setStartDelay(long startDelay);
//完全克隆一個ValueAnimator執行個體,包括它所有設定以及所有對監聽器代碼的處理, 注意 克隆出來的監聽器對象是一個獨立的個體,可以自己重新設定屬性
public ValueAnimator clone();