2012-05-24 43 views
3

我有一個Animation導致滑出屏幕的右側視圖的視圖初始狀態,這是工作與下面的代碼預期:Android的動畫 -

Animation outtoRight = new TranslateAnimation(
     Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, +1.0f, 
     Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f 
     ); 
outtoRight.setDuration(500); 
outtoRight.setInterpolator(new AccelerateInterpolator()); 
outtoRight.setFillAfter(true); 

這意味着,我應用此動畫的視圖將在屏幕外精美地滑動。我有一個相反的滑動當然。但是我的問題是,我怎樣才能將視圖放在屏幕外面,這樣我就可以將其放入幻燈片中,而不至少將其應用一次?

我已經玩過負邊空白等等,但是我似乎找不到適合我的視角的屬性,使其在屏幕上出現。

只是爲了澄清一下,我可以從另一個動畫開始就完美地隱藏它,但我可以看到它即將消失,即使它只有幾分之一秒。必須要有一種方法,讓它在一開始就不在那裏,並讓我在之後滑過它。

回答

4

我不是動畫專家,但我給它一個鏡頭:)

這是我使用的動畫,它的幻燈片從右側

EnterByRight視圖。 XML

<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="false"> 
    <translate android:fromXDelta="100%" android:toXDelta="0%" 
     android:fromYDelta="0%" android:toYDelta="0%" 
    android:duration="400"/> 
    </set> 

在我的情況,我在動畫XML定義的TableLayout。當我想它要在幻燈片:

Animation animationEnterByRight = AnimationUtils.loadAnimation(this, R.anim.animationentrancebyright); 
tableLayout.startAnimation(animationEnterByRight); 

它來自出來的畫面,我不需要外部的第一位置,它的動畫需要照顧,對我。如果您想在加載視圖時對其進行動畫處理,則此工作正常。

如果您需要在一段時間內保持您的視圖「隱藏」,然後顯示動畫,我無法考慮除View.Visible和View.Gone之外的任何解決方案。但我不明白爲什麼會出現這個問題?

乾杯!

1

你可以試試outtoRight.setFillBefore(false);

+0

試過了,事情是,我需要第三個動畫只是把它放在屏幕上開始,這似乎有點奇怪。 –

3

一個可能的解決方案(考慮到這個問題真的很少受歡迎)可以是我目前使用的解決方案,儘管我根本不喜歡它。我已經制作了一個可見度爲View.GONE的視圖,並應用使它向右移動的動畫。

然後,第一次(我控制這是第一次在視圖上有一個標籤)我設置了View.VISIBLE的可見性,並應用動畫來滑入。這個按預期工作,沒有毛刺和跳躍,但我是仍然關注將動畫添加到許多與演出相關的元素的意義。

2

其實你自己的答案一點也不差。我唯一需要改變的不是將您的生存能力設置爲GONE,而是使用addChild()手動創建和添加它。

在分離線程中添加動畫,在分離線程中添加動畫,並且只在主線程上調用addChild()

一般來說,你應該在分開的線程上執行init進程,這樣UI線程就不會受到影響,如果它需要超過0.4秒,你應該開始播放加載動畫至少0.5秒。這是我可以告訴你的最好的用戶界面實踐,我在我的應用程序中完成了它,它非常棒!

+0

我喜歡+1 :) –

+0

@Juan然後去試試吧;) –

1

您可以使用PreDrawListner()在繪製之前將視圖的位置設置在屏幕之外,然後爲其繪製幻燈片動畫。

yourview.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
    @Override 
     public boolean onPreDraw() { 
      yourview.getViewTreeObserver().removeOnPreDrawListener(this); 
      yourview.setTranslationX(something that will take it out of the screen, depends on padding); 
      yourview.runIntroAnimation(); 
      return false; 
     } 
};