2013-04-26 66 views
22

我有一個奇怪的問題,AlphaAnimation。當調用AsyncTask處理程序時,它應該重複運行。直到UI更新或觸摸事件纔開始動畫

但是,第一次在Activity中調用處理程序時,除非我觸摸屏幕或更新UI(例如按手機的菜單按鈕),否則動畫將不會啓動。

奇怪的部分是,一旦動畫運行至少一次,如果再次調用處理程序,它將毫無問題地啓動。

下面的代碼是什麼樣子:

// AsyncTask handler 
public void onNetworkEvent() 
{ 
    this.runOnUiThread(new Runnable() { 
    @Override 
    public void run() 
    { 
     flashScreen(Animation.INFINITE); 
    } 
    }); 
} 

// Called method 
private void flashScreen(int repeatCount) 
{ 
    final View flashView = this.findViewById(R.id.mainMenuFlashView); 

    AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0); 
    alphaAnimation.setRepeatCount(repeatCount); 
    alphaAnimation.setRepeatMode(Animation.RESTART); 
    alphaAnimation.setDuration(300); 
    alphaAnimation.setInterpolator(new DecelerateInterpolator()); 
    alphaAnimation.setAnimationListener(new Animation.AnimationListener() { 
    @Override 
    public void onAnimationStart(Animation animation) 
    { 
     flashView.setVisibility(View.VISIBLE); 
    } 

    @Override 
    public void onAnimationEnd(Animation animation) 
    { 
     flashView.setVisibility(View.GONE); 
    } 

    @Override 
    public void onAnimationRepeat(Animation animation) { } 
    }); 

    flashView.startAnimation(alphaAnimation); 
} 

我注意到,runOnUIThread是沒有必要的(如果我不使用相同的結果發生),但我更喜歡保持它作爲我不是在UI線程上。

有什麼想法可能導致這種情況?

+0

太少的代碼來理解你的呼叫順序。你能發佈圍繞Asynctask執行的部分嗎?另外,您是否嘗試將條目記錄到相關方法以查看發生了什麼? – ilomambo 2013-04-26 14:50:22

+0

嘗試第一次延遲動畫幾秒鐘。在視圖準備好之前嘗試運行動畫時,可能會出現這種情況。 – 2013-04-26 14:51:01

回答

39

多一點的研究表明,我的問題是一樣的一個這樣的問題: Layout animation not working on first run

flashView的知名度被默認設置爲GONE(導致Animation不立即開始爲View從未渲染),所以我只需要調用flashView.startAnimation()

+0

謝謝,讓INVISIBLE幫助了我。 – Vasanth 2015-02-23 10:59:13

0

這不是一件容易的事。直到你有一個真正的答案:動畫開始由onNetworkEvent觸發。由於我們不知道代碼的其餘部分,所以您應該看看那裏,嘗試通過其他可以輕鬆識別的事件來更改網絡事件,只是爲了調試代碼的其餘部分是否正常,或者如果它只是觸發器對此負責。

+1

我可以很容易地觸發它,它正在工作。調試表明,在我第一次與UI交互之前,不會調用AnimationListener的'onAnimationStart'。 – Jukurrpa 2013-04-26 14:31:24

+0

@Jukurrpa此問題是否適用於所有Android版本或某些特定版本? – Kai 2013-04-26 14:34:04

+0

@Kai我只有4.1和4.2的設備可以使用它,並且它在兩者上都可以。 – Jukurrpa 2013-04-26 14:39:59

21

如果設置ViewVISIBLE將無法​​正常工作,因爲在我的情況下,它幫助我在開始日前將調用requestLayout()之前將其設置爲INVISIBLE ËAnimation,就像這樣:

Animation an = new Animation() { 
... 
view.requestLayout(); 
view.startAnimation(an); 

就我而言,我的View0dip高,這防止onAnimationStart被調用,這幫助我身邊的這個問題。

+2

在某些版本的Android上,即使它的高度或寬度視圖的初始值爲0dip,它也不起作用。在我的一個案例中,我不得不初始化1dip,並且因爲保證金,視圖不可見。這有助於動畫在所有版本中都可用。 – Oknesif 2014-10-15 13:29:03

1

這爲我工作:

view.setVisibility(View.VISIBLE); 
view.startAnimation(animation); 

我不得不設置viewVISIBLE(不INVISIBLE,既不GONE),導致它的動畫所需的視圖renderization。