天天看點

屬性動畫

  • 視圖動畫與屬性動畫的差別:
    • 引入時間不同
      • 視圖動畫API1引入發,屬性動畫在API11
    • 所在包名不同
      • 視圖動畫: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執行個體:
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()于ofFloat()函數:
//都是可變長函數,是以可以傳入任何數量的值,比如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();
           

繼續閱讀