2014-09-30 51 views
1

我創建了一個非常簡單的動畫,它應該使圖標淡出然後返回,然後返回。 (只是爲了好玩)Android視圖淡出,但不會褪色

當你點擊屏幕時,我希望圖標在50毫秒內淡出,然後立即淡入,並立即再次淡出。

但是,當我點擊時,圖標淡出,什麼也沒做!

這裏是方法:

public boolean onTouchEvent(MotionEvent event) { 
     centralIcon = (ImageView) findViewById(R.id.centralIcon); 
     float fullAlpha = centralIcon.getAlpha(); 
     centralIcon.animate().setDuration(50); 
     centralIcon.animate().alpha(0); 
     centralIcon.animate().alpha(fullAlpha); 
     centralIcon.animate().alpha(0); 
     return true; 
    } 

爲什麼不會它漸退?

回答

1

你指定的是3個應該一個接一個發生的動畫,但是你編碼動畫的方式不會一個接一個地發生,你所做的只是返回與之關聯的ViewPropertyAnimator該視圖是一個實例,並重寫了三次alpha動畫(如調用alpha()創建一個新的動畫並在alpha屬性上取消任何更多),因此只有最後一個會運行。

您應該創建一個動畫集並在上一個完成之後抵消動畫以啓動(可能超過50 ms,因爲這非常短,幾乎不會引起注意)。

此代碼應工作:

AnimationSet a = new AnimationSet(true); 

    float fullAlpha = centralIcon.getAlpha(); 

    AlphaAnimation alpha[] = new AlphaAnimation[3];//array of 3 alpha animations 

    alpha[0] = new AlphaAnimation(fullAlpha, 0);//first fade to 0 
    alpha[0].setDuration(300); 

    alpha[1] = new AlphaAnimation(0, fullAlpha);//then fade back to full 
    alpha[1].setDuration(300); 
    alpha[1].setStartOffset(300);//start after alpha[0] finishes 

    alpha[2] = new AlphaAnimation(fullAlpha, 0);//then fade back to 0 
    alpha[2].setDuration(300); 
    alpha[2].setStartOffset(600);//start after alpha[0] and alpha[1] finish 

    for(AlphaAnimation current : alpha) 
     a.addAnimation(current);//add all the animations to the set 

    a.setInterpolator(new LinearInterpolator()); 

    centralIcon.setAnimation(a);//attach the animation set to the view 
    a.startNow();//start the animation set 
+0

沒有錯誤,但不起作用。在調試模式下,當我點擊屏幕時,它似乎現在調用我的onTouch方法三次。 – Raphi 2014-09-30 09:50:01

+0

雖然我沒有測試過你的代碼,但我同意這一點。但是,我不同意這樣的說法,即創建4個獨立的動畫,只有最後的動畫纔會運行。第一次調用中設置的持續時間由其他動畫使用,特別是最後一次未被取消的動畫。 – 2014-09-30 11:36:48

+0

你是對的,我看了谷歌SDK文檔上的animate()調用,它返回與視圖相關的ViewPropertyAnimator,我更新了答案 – AndroidNoob 2014-09-30 13:20:48

1

來源:http://developer.android.com/reference/android/view/ViewPropertyAnimator.html

public ViewPropertyAnimator alpha (float value) 

在API級別12 此方法將導致視圖的alpha屬性被動畫到指定值。 已經在該屬性上運行的動畫將被取消。


問題的一部分以粗體顯示。您立即再次調用alpha來取消前兩個alpha動畫。 (你可以通過改變目標alpha值來測試它。)即使情況並非如此,預計動畫按照你想要的方式行事是沒有意義的。 animate()。alpha(value)不符合你的設想。

如果您希望視圖在50毫秒後開始淡入淡出,您需要以某種方式指定延遲。有很多方法可以使這個序列發生。例如,您可以使用您在稍後動畫中指定的偏移量創建一個AnimationSet(如AndroidNoob所回答的那樣)。您可以添加一個AnimationListener來偵聽動畫的結尾以開始下一個動畫。您可以創建另一個線程,在UI線程上運行一系列動畫。