2017-04-17 124 views
1

我試圖在Android中創建(我認爲是)相對簡單的動畫。也就是說,我想讓某個TextView縮小到0,並在點擊一個按鈕時回到1。當我點擊按鈕時實際發生的事情是TextView立刻縮小到0(沒有動畫),然後動畫只縮放回到1.TextView:縮小比例並按順序動畫放大

在一些失敗的嘗試只使用View.animate()方法後,我訴諸了到動畫和AnimatorSet和限定在動畫XML象下面這樣:

scale_down.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 

<objectAnimator 
    android:propertyName="scaleX" 
    android:valueFrom="0" 
    android:valueTo="1" 
    android:duration="300"/> 

<objectAnimator 
    android:propertyName="scaleY" 
    android:valueFrom="0" 
    android:valueTo="1" 
    android:duration="300"/> 

</set> 

scale_up.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 

<objectAnimator 
    android:propertyName="scaleX" 
    android:valueFrom="1" 
    android:valueTo="0" 
    android:duration="300"/> 

<objectAnimator 
    android:propertyName="scaleY" 
    android:valueFrom="1" 
    android:valueTo="0" 
    android:duration="300"/> 

</set> 

代碼在動畫()方法,從的onClick()方法

private void animate() { 
     Animator scaleTextDown = AnimatorInflater.loadAnimator(this, R.animator.scale_down); 
     scaleTextDown.setTarget(mFactTextView); 

     Animator scaleTextUp = AnimatorInflater.loadAnimator(this, R.animator.scale_up); 
     scaleTextDown.setTarget(mFactTextView); 

     AnimatorSet setScaleDownAndUp = new AnimatorSet(); 
     setScaleDownAndUp.playSequentially(scaleTextDown, scaleTextUp); 
     setScaleDownAndUp.start(); 
    } 

當我試圖創建使用簡單View.animate()我得到了它的方法預期動畫被稱爲使用處理器工作在下面的onClick()方法中添加一個break,但我懷疑這是做到這一點的「正確」方法。

public void onClick(View view) { 
    //... 
    mFactTextView.animate().scaleX(0).scaleY(0).setDuration(300).start(); 

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      mFactTextView.animate().scaleX(1).scaleY(1).setDuration(300).start(); 
     } 
    }, 300); 
    //... 
} 

所以上面顯然這個簡單的代碼工作,而無需使用任何XML等

的我是比較新的Android和我已經開始探索動畫,所以我詢問是否實際上是一個有「更好」的方式來連續鏈接這些動畫?我的意思是playSequentially()方法的存在表明應該有一種方法可以在沒有Handler的情況下完成這項工作。也許問題是兩個動畫都涉及同一個對象,但我想這不是一個罕見的用例。雖然它只是相反方向的動畫,但它仍然是罕見的用例。

編輯:我更新了XML代碼,以正確反映預期的縮放比例(謝謝azizbekian),它仍然無法按預期工作。我現在正在得到相反的行爲。在初始點擊按鈕時,文本現在簡單地縮小到0並丟失。在後續點擊時,它會以全尺寸(無縮放動畫)簡要顯示,然後將縮放動畫縮小到0,然後再次丟失。

從技術上講,在最初的XML文件和更新的文件(下面)中,只有第一個動畫實際上正在發生,至少在視覺上 - scale_down.xml被用作Animator的源。

scale_down.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 

<objectAnimator 
    android:propertyName="scaleX" 
    android:valueFrom="1" 
    android:valueTo="0" 
    android:duration="300"/> 

<objectAnimator 
    android:propertyName="scaleY" 
    android:valueFrom="1" 
    android:valueTo="0" 
    android:duration="300"/> 

</set> 

scale_up.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 

<objectAnimator 
    android:propertyName="scaleX" 
    android:valueFrom="0" 
    android:valueTo="1" 
    android:duration="300"/> 

<objectAnimator 
    android:propertyName="scaleY" 
    android:valueFrom="0" 
    android:valueTo="1" 
    android:duration="300"/> 

</set> 

回答

3

你不需要處理,因爲有withEndAction() API:

mFactTextView.animate().scaleX(0).scaleY(0).setDuration(300).withEndAction(new Runnable() { 
    @Override 
    public void run() { 
     mFactTextView.animate().scaleX(1).scaleY(1).setDuration(300); 
    } 
}); 

無需調用start()明確地說,動畫將在下一幀開始。

而之所以爲什麼xml不適合你,是因爲你錯誤地指定了開始和結束值。動畫應該從1開始並最終爲0,並且scale_up應該從0開始並且動畫到1。

更新

您正在執行的同一個實例setTarget()兩次。將第二個scaleTextDown.setTarget()更改爲scaleTextUp.setTarget()

+0

感謝您提供withEndAction()API並發現XML文件中的錯誤。但是,即使在我更新XML之後,我仍然有相同(或類似)的問題 - 主要問題更新中的更多細節。 –

+0

@BobanTalevski,已更新。 – azizbekian