2012-08-29 35 views
1

我試圖用動畫淡出ImageView。動畫運行,淡出了ImageView,但圖像回到完全不透明狀態。爲什麼會發生?爲什麼ImageView alpha動畫意外行爲?

private void fadeOutImage() { 
    final ImageView imageView = (ImageView) activity.findViewById(R.id.imageView); 
    imageView.startAnimation(AnimationUtils.loadAnimation(activity, R.anim.fadeout)); 
} 

我試着將α設置爲零,如下圖所示,但是圖像從未出現過週期。爲什麼不?

private void fadeOutImage() { 
    final ImageView imageView = (ImageView) activity.findViewById(R.id.imageView); 
    imageView.setAlpha(0); 
    imageView.startAnimation(AnimationUtils.loadAnimation(activity, R.anim.fadeout)); 
} 

爲了得到這個工作,我不得不創建一個AnimationListener,超載onAnimationEnd,並設置阿爾法爲零那裏。爲什麼?

final ImageView imageView = (ImageView) activity.findViewById(id); 
    Animation animation = AnimationUtils.loadAnimation(activity, R.anim.fadeout); 
    animation.setAnimationListener(new AnimationListener() { 

    @Override public void onAnimationStart(Animation animation) { 
     imageView.setAlpha(255); 
    } 

    @Override public void onAnimationRepeat(Animation animation) { } 

    @Override public void onAnimationEnd(Animation animation) { 
     imageView.setAlpha(0); 
    } 
    }); 
    imageView.startAnimation(animation); 

動畫XML:

<alpha 
    android:duration="1500" 
    android:fromAlpha="1.0" 
    android:interpolator="@android:anim/accelerate_interpolator" 
    android:toAlpha="0.0" /> 
+0

你嘗試過'imageView.clearAnimation();'當動畫結束? – MKJParekh

+0

@MKJParekh不,你問爲什麼? –

+0

我通常使用''Animation.setFillAfter(true)''。不知道這是否是最佳做法,但在大多數情況下都適用於我。 – harism

回答

1

我想用一個動畫來淡出的ImageView使用,而不是

imageView.setVisibility(View.INVISIBLE); 

。動畫運行,淡出ImageView,但是圖像 回到完全不透明狀態。爲什麼會發生?

該動畫的效果是臨時。動畫完成後,視圖將返回到動畫開始前的狀態。

我試着將α設置爲零,如下圖所示,但圖像從未出現 顯示期間。爲什麼不?

雖然apparently undocumented,在fromAlphatoAlpha參數出現在方式行事。零的100%仍然爲零。我通過將alpha開始到非常低的值來驗證這一點,並且我可以看到動畫導致alpha從低值開始並且漸變爲透明。

爲了得到這個工作,我必須創建一個AnimationListener,將onAnimationEnd重載爲 ,並將alpha設置爲零。爲什麼?

由於動畫效果是暫時的,因此您需要在動畫後將對象設置爲透明。您還必須確保在開始動畫之前將對象重置爲不透明。

看起來你可以使用從API 11開始的ObjectAnimator直接使用而不是乘法地設置alpha(或任何其他屬性)的值。

6

當您啓動動畫,它確實需要的任何觀點目前的樣子,根據你提供的動畫動畫,但沒有過真正的變化視圖狀態

這可能會讓人困惑,但在第一種情況下,在動畫結束後,ImageView會回到它在動畫之前的樣子 - 在您的情況下是正常的不透明。

在你的第二個例子,你是阿爾法之前設置爲零動畫開始,並且在動畫開始,所以當播放時,圖像已經是不可見的,所以動畫這種無形的ImageView - 你不能看到。

因此,所需的順序是在更改ImageView之前啓動動畫,讓它播放出來,然後在動畫結束的時候,更改ImageView的狀態,使其在它被重繪之前消失原始狀態。這是覆蓋onAnimationEnd()的原因。

因此,回顧一下,在適當的實施,有影響的ImageView被繪製方式兩件事情:

  • 動畫,從而影響到ImageView的外觀只在動畫播放
  • imageView.setAlpha(0);方法調用,以保持圖像不可見一旦動畫結束

注:到可能增加的表現,我建議imageView.setAlpha(0);

+0

我假設你的意思是說它不會永久改變視圖的狀態。當然,動畫至少暫時改變視圖的狀態。我還假設你的意思是使用 'imageView.setVisibility(View.INVISIBLE)'而不是設置alpha。在我接受你的答案之前,我想要 –

+0

它暫時覆蓋了它的繪製方式,但不,我不相信視圖的任何狀態(字段,屬性,屬性等)都會改變。編輯:除非,作爲harism建議,您設置Animation.setFillAfter(true),雖然我聽說如果動畫更改視圖的大小可能會有問題。 – skyrift