2012-04-17 63 views
1

我需要這個API11項目。Android動畫視圖進入屏幕,推動當前全屏視圖

我正在尋找一種方法來從右側添加視圖,這將導致當前的全屏視圖向左移動以允許新視圖在屏幕中呈現。

新視圖約爲屏幕寬度的1/3,因此當前的全屏視圖應移出屏幕的距離。

我已經厭倦了TranslateAnimation()的各種解決方案,雖然我很滿意動畫,但我在原始視圖中的所有可點擊區域都沒有出現問題。

所以我開始玩佈局正確定位與負邊距,但幾秒鐘後,當一個新的佈局請求來視圖彈出到位。在移動動畫結束偵聽器上的視圖時,此解決方案也會產生波濤洶涌的效果。

什麼是最簡單的解決方案,在新視圖進入或退出時具有良好的動畫效果,並使視圖在佈局方面處於正確位置。

回答

0

您可能會這樣做,而不是使用fillAfter和fillEnabled,您需要以編程方式在AnimationListener的onAnimationEnd中更改佈局,以匹配您想要的最終定位。

要刪除閃爍,請在您正在動畫的視圖上調用clearAnimation(),同樣在onAnimationEnd中調用。

+0

是的,這就是我正在做的。在調用view.layout(new coords)之後,儘管視圖移動到了正確的位置(這也需要x上的負邊距),但一段時間後系統再次調用佈局,並且視圖恢復到原位。我嘗試了各種確保這種情況發生的方法,我擴展了佈局並更改了佈局(r,t,l,b)中的值以反映正確的位置,而這完全沒有任何影響。 – totem 2012-04-17 18:46:08

+0

你能發佈你的代碼嗎?我不清楚你指的是什麼。 – 2012-04-17 19:05:02

10

由於您使用API​​11,請使用Animator API。所有視圖現在都具有相應的setter和getter屬性。到視圖向左移動超出範圍,獲得屏幕的寬度然後做:

View viewToShiftOut = getOutView(); 
ObjectAnimator outAnim = ObjectAnimator.ofFloat(viewToShiftOut, "x", 0, -widthOfScreen); 
outAnim.setDuration(1000); 
outAnim.start(); 

這將轉向的視圖,它完全是內容在屏幕的1秒(1000毫秒)的持續時間。在它的地方轉移一個做到這一點:

View viewToShiftIn = getInView(); 
ObjectAnimator inAnim = ObjectAnimator.ofFloat(viewToShiftIn, "x", widthOfScreen, 0); 
inAnim.setDuration(1000); 
inAnim.start(); 

的所有屬性,可點擊區域等將遵循視圖,所以你當動畫完成來完成。你可以像這樣在一起,它們的動畫:

View viewToShiftOut = getOutView(); 
View viewToShiftIn = getInView(); 
ObjectAnimator outAnim = ObjectAnimator.ofFloat(viewToShiftOut, "x", 0, -widthOfScreen); 
ObjectAnimator inAnim = ObjectAnimator.ofFloat(viewToShiftOut, "x", widthOfScreen, 0); 
outAnim.setDuration(1000); 
inAnim.setDuration(1000); 
outAnim.start(); 
inAnim.start(); 

Blog post

編輯:我注意到你想只用1/3的一個視圖切換,這樣你就可以得到的像素量widthOfScreen/3轉向各。編輯2:另一個優點是你可以使用它與硬件加速沒有大多數3.0+平板電腦有麻煩。

+0

我的錯誤,顯然我的意思是預先API 11,沒有setX setY或對象動畫師。 – totem 2012-04-18 23:06:43

+0

好的。我沒有太多的經驗。我認爲人們通常的做法是相應地設定利潤率。在這種情況下,您需要以編程方式設置要移出的視圖的左右邊距,以便切換到視圖寬度的差異。負邊距會將視圖移出屏幕。您要移入的視圖的左邊距爲「screensize-viewWidth」,右邊距爲「0」。調用'requestLayout()'並且它*應該*設置一切。我從來沒有這樣做過,所以我不會把它作爲答案,但似乎它會對我有用。 – DeeV 2012-04-19 17:27:12