2011-07-02 41 views
1

我試圖代碼每個樣品我可以找到一個定義和運行幀動畫,但ImageView的永遠不會改變。 ImageView中的原始圖像保留。幀動畫未運行

編輯: 後試錯的很多天,我跑了APK我的手機,而不是在模擬器上。 它適用於我的手機,但由於某些原因,它不在模擬器上。

回答

4

最底部我並不很清楚爲什麼你不能從的onCreate線開始動畫,需要將它們貼在視圖的處理程序創建的任何線程上。

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    final ImageView view = (ImageView) findViewById(R.id.shell); 
    view.setVisibility(ImageView.VISIBLE); 
    view.setBackgroundResource(R.drawable.animation_frame); 

    view.post(new Runnable(){ 

     public void run(){ 
     AnimationDrawable frameAnimation = (AnimationDrawable) view.getBackground(); 
     frameAnimation.start(); 
     } 
    }); 
    } 
} 

我不知道爲什麼你需要這樣做,但你這樣做。

編輯:這裏是我的工作項目中的片段應該是你所需要的一切......

在Java中的onCreate:

final ImageView image1 = (ImageView) v.findViewById(R.id.coin1); 
image1.post(new Runnable() { 

     @Override 
     public void run() { 
      AnimationDrawable ani = (AnimationDrawable) image1.getBackground(); 
      ani.start(); 
     } 
    }); 

在XML佈局:

 <ImageView android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/coin" 
     android:id="@+id/coin1"/> 

硬幣XML :

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> 
    <item android:drawable="@drawable/coin_spin_a" android:duration="100"/> 
    <item android:drawable="@drawable/coin_spin_b" android:duration="100"/> 
    <item android:drawable="@drawable/coin_spin_c" android:duration="100"/> 
    <item android:drawable="@drawable/coin_spin_d" android:duration="100"/> 
    <item android:drawable="@drawable/coin_spin_e" android:duration="100"/> 
    <item android:drawable="@drawable/coin_spin_f" android:duration="100"/> 
</animation-list> 
+0

使用代碼重新複製你的代碼,我得到的錯誤:第14行:類型新的Runnable(){}必須實現繼承的抽象方法Runnable.run()。 Line16:令牌「開始」的語法錯誤,此令牌之後預期的標識符。 –

+0

@Miles O'Keefe很抱歉,修正了。 – schwiz

+0

這次沒有錯誤,但ImageView保持不變。如果此代碼正在爲您工作,您可以上傳一個項目嗎? –

0

我與它掙扎了一段時間爲好。這是在Android框架動畫教程中解釋的,但讓我們說「小字母」。讓我的答案從那裏複製:

需要注意的是不能將活動的onCreate()方法中調用呼籲AnimationDrawable的start()方法是很重要的,因爲AnimationDrawable尚未完全附着窗戶。如果您想要立即播放動畫而不需要交互,那麼您可能需要從Activity中的onWindowFocusChanged()方法調用該動畫,這會在Android將窗口放到焦點上時調用。

這是在http://developer.android.com/guide/topics/graphics/view-animation.html#frame-animation

+0

我遵循這個建議,但圖像保持不變。我添加了: TextView top =(TextView)findViewById(R.id.top); \t top.setText(「Started」); after frameAnimation.start();以測試聽衆是否真的被觸發。 文本更改爲「開始」,但圖像未更改。 –

+0

據我所知,它應該工作。你還可以在onWindowFocusChanged()而不是onCreate中設置動畫可繪製嗎?它不應該有所作爲,但也許...如果它不工作,仍然 –

0

想給schwiz回答添加評論。

我能得到它的工作從一個工作線程調用Handler.post。以下是示例。

public void onCreate(Bundle savedInstanceState) { 

    Thread t; 
    final ImageView activityIndicator; 
    final AnimationDrawable animiDrawable; 
    LinearLayout contentPlaceholder; 

    contentPlaceholder = (LinearLayout)this.findViewById(R.id.content_placeholder); 
    activityIndicator = new ImageView(this); 
    contentPlaceholder.addView(activityIndicator); 
    activityIndicator.setBackgroundResource(R.drawable.ic_activity_indicator_bar); 
    animiDrawable = (AnimationDrawable)activityIndicator.getBackground(); 

    t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      mCbt.mThreadHandler.post(new Runnable() { 
       @Override 
       public void run() { 
        animiDrawable.start(); 
       } 
      }); 
     }; 
    }); 
    t.start(); 
}