2013-08-16 82 views
0

我正在做Android中兩個活動之間的淡入/淡出動畫。兩個活動都有一個白色背景(全息燈主題)。在淡入淡出的活動中,我將alpha從0變爲1,在淡出的活動中從1變爲0。在動畫中淡入/淡出不斷的背景色

我的問題是,感知的背景顏色不是整個動畫,我覺得很煩人。也就是說,背景會變暗,然後在動畫的持續時間內變亮。所以在動畫的中間,背景不會是白色的,而是中間的灰色。

我想使用兩個內插器,使得兩者的組合效果都能產生恆定的背景色。我認爲linear內插器會做的伎倆,因爲他們保持兩個alpha的總和不變。但它不起作用:在動畫過程中背景顏色會發生變化。標準acceleratedecelerate也沒有我想要的行爲。

所以,我的問題是:是否有任何已知的內插器(可能是accelerate,decelerate具有一定的速率),在淡入/淡出動畫中給出恆定的背景色?

+0

你所描述的只是動畫的工作原理。它聽起來像你想要的只是動畫一個,然後在動畫完成後顯示另一個。您可能需要編寫一個自定義動畫(在'XML'中才能正確使用)。 – Phil

+0

如果我只有一個(淡出),背景顏色將不可避免地從白色(alpha 1)變爲黑色(alpha 0)。不是我想要的。 –

+0

所以如果我理解正確 - 你想要一個不變的背景顏色。那麼你爲什麼要動畫?看起來你應該在你想要的時間間隔內用你想要的顏色顯示覆蓋圖。 – Phil

回答

0

我知道了!

簡短回答:消除兩個動畫之一。從主要活動到次要活動時,只使用淡入。從中學到主要活動時,只使用淡出。詳情和解釋如下。

有兩種方法可以將兩種顏色與alpha值組合。該過程被稱爲「alpha compositing」。做組合中的一種簡單的方式,這是中常用的方法,是:

的(a)C = C1 * ALPHA1 + C2 *α-2

如果已應用的組合方法如果C1C2等於「背景」顏色Cbg,則使用alpha1alpha2的兩個線性內插器將給出恆定顏色。具體而言,如果alpha1 = t(其中t代表時間),alpha2 = 1-tC1 = C2 = Cbg,則組合(a)給出C = Cbg*t + Cbg*(1-t) = Cbg。也就是說,根據需要,複合顏色C等於Cbg而與t無關。

然而,看來這Android是應用組合是所謂的 「上」 操作符:

(B)C = C1 * ALPHA1 + C2 *α-2 *(1-α1)

其中可以認爲與顏色C1像素是超過C2。使用組合方法(b),爲了獲得具有C1 = C2 = Cbg的像素的恆定顏色C,只需alpha2 = 1,因爲那時C = Cbg*alpha1 + Cbg*1*(1-alpha1) = Cbg

所以內插器應該是任何針對作爲超過1(沒有動畫),選擇那些爲下活性的活性(線性或其他方式)。

因爲我不知道的Android如何決定哪些活動已經結束,這下,我做了一些實驗,結果發現:

  • 當主活動產生的次要活動,充分程序爲次要活動使用淡入式插入器。

  • 當輔助活動返回到主活動時,適當的過程是爲輔助活動設置淡出內插器。

所以它看起來像Android是考慮到次活動是在主一個。這是有道理的,因爲輔助是由主輔助創建的。

  • 由於主要活動不必使用任何動畫,根據documentation它應該足夠其動畫設置爲0,即使用overridePendingTransition(R.anim.fadein, 0)。但是,我發現這隻有時纔有效。爲了得到它的工作,我需要定義一個從「alpha 1.0」到「alpha 1.0」的「假」淡入淡出(所以它實際上什麼都不做)並使用overridePendingTransition(R.anim.fadein, R.anim.fakefade)

至於需要假動畫而不是0動畫,我沒有解釋。

我希望Android文檔更清晰。它會爲我節省相當一段時間。

1

從評論中,這聽起來像你想活動的意見,而不是活動本身。您可以使用droidQuery庫執行此操作。只需設置這是您的onPause()方法:

@Override 
public void onPause() { 
    //here, substitute mainView with the id of your background 
    $.with(this, R.id.mainView).selectChildren().selectAll().animate("{ alpha : 0.0f }", 400, $.Easing.LINEAR, $.noop()); 
    super.onPause(); 
} 

這將選擇所有屬於你的背景的孩子們的意見,並使用ObjectAnimator,直線插補,以及400ms的時間動畫它們的α值設置爲0。

你也將要重寫onResume()

@Override 
public void onResume() { 
    //here, substitute mainView with the id of your background 
    $.with(this, R.id.mainView).selectChildren().selectAll().animate("{ alpha : 1.0f }", 400, $.Easing.LINEAR, $.noop()); 
    super.onResume(); 
} 

這不正好相反 - 從0阿爾法動畫到1

+0

感謝您的答案。通過這種方法,兩種活動的淡入淡出是同步的嗎? –

+0

@LuisMendo我不確定,因爲這些是視圖動畫,而不是活動轉換動畫,但是再加上一個活動動畫('overridePendingTransition'),這應該提供一個非常接近你想要的效果。 – Phil

+0

我明白了。如果感興趣,請看我自己的答案。所需的效果是通過使用_one_ alpha動畫而不是兩個來實現的。 –