2013-02-12 110 views
0

我有16張圖像代表有人在擲球。我想用這些圖像製作流暢的動畫。用20張圖像/秒,眼睛認爲這是一種運動,而不是一連串的圖像。所以,我想顯示1個圖像每隔50ms製作流暢的動畫

public void fire() { 
final ImageView image3 = (ImageView) gameactivity.findViewById(R.id.imageView3); 
final int drawables[] = new int[] {R.drawable.fire1,R.drawable.fire2,R.drawable.fire3,R.drawable.fire4,R.drawable.fire5,R.drawable.fire6,R.drawable.fire7,R.drawable.fire8,R.drawable.fire9,R.drawable.fire10,R.drawable.fire11,R.drawable.fire12,R.drawable.fire13,R.drawable.fire14,R.drawable.fire15,R.drawable.fire16}; 
for (int i=0;i<drawables.length;i++) { 
    final int j=i; 
    Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      image3.setImageResource(drawables[j]); 
      Log.w("GAMEACTIVITY","image"+j); 
     } 
    }; 
    gameactivity.handler.postDelayed(runnable, 50*j); 
    } 
} 

但動畫不是流體我看到的第一個圖像,然後什麼,然後最後一個,可能是因爲50ms的時間太短,使的行動之間的區別Runnables?

編輯 使用動畫繪製

ImageView image2 = (ImageView) findViewById(R.id.imageView3); 
     image2.setBackgroundResource(R.drawable.fire); 
     AnimationDrawable fireAnimation = (AnimationDrawable) image2.getBackground(); 
     image2.setOnTouchListener(new OnTouchListener(){ 

      @Override 
      public boolean onTouch(View arg0, MotionEvent arg1) { 
       fireAnimation.start(); 
       return false; 
      } 

我還有一個內存錯誤。這不是第一次發生,我真的不知道該如何處理它(讀了很多關於內存泄漏,但我不認爲這是)

02-12 10:20:30.279: E/dalvikvm-heap(1349): 1535664-byte external allocation too large for this process. 
02-12 10:20:30.319: E/GraphicsJNI(1349): VM won't let us allocate 1535664 bytes 
02-12 10:20:30.319: W/dalvikvm(1349): threadid=1: thread exiting with uncaught exception (group=0x40018560) 
02-12 10:20:30.329: E/AndroidRuntime(1349): FATAL EXCEPTION: main 
02-12 10:20:30.329: E/AndroidRuntime(1349): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:460) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.content.res.Resources.loadDrawable(Resources.java:1709) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.content.res.Resources.getDrawable(Resources.java:581) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.graphics.drawable.AnimationDrawable.inflate(AnimationDrawable.java:267) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:787) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.graphics.drawable.Drawable.createFromXml(Drawable.java:728) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.content.res.Resources.loadDrawable(Resources.java:1694) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.content.res.Resources.getDrawable(Resources.java:581) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.view.View.setBackgroundResource(View.java:7533) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at com.example.kersplatt.GameActivity.onCreate(GameActivity.java:69) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.os.Looper.loop(Looper.java:130) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at java.lang.reflect.Method.invoke(Method.java:507) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:875) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:633) 
02-12 10:20:30.329: E/AndroidRuntime(1349):  at dalvik.system.NativeStart.main(Native Method) 

回答

2

如果你有一堆圖像,你應該檢查出Android Drawable Animation而不是使用可運行。

它允許您定義一組drawables和每個應顯示的持續時間。

它由本平臺本地支持,並將更加簡單和無痛苦地實施。

+0

我有一個內存錯誤(請參閱編輯),你可以知道如何處理這個問題? – morg 2013-02-12 10:16:17

1

您需要,否則預載的圖片中setImageResource()將加載(從存儲讀取)的圖像在每個電話應該需要超過50ms(我想你的圖像不只是20x20)

2

使用FrameAnimation,例如res/drawable/movie.xml

<?xml version="1.0" encoding="utf-8"?> 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:oneshot="true"> 
    <item android:drawable="@drawable/frame1" android:duration="50" /> 
    <item android:drawable="@drawable/frame2" android:duration="50" /> 
    <item android:drawable="@drawable/frame3" android:duration="50" /> 
    etc... 
</animation-list> 

然後在Java中:

imageView.setBackgroundResource(R.drawable.movie); 
AnimationDrawable anim = (AnimationDrawable) imageView.getBackground(); 
anim.start(); 
+0

看到我的編輯請:) – morg 2013-02-12 10:22:00

+0

你使用非常大的圖像? – jlopez 2013-02-12 10:25:40

+0

每個圖像大約是85KB, – morg 2013-02-12 10:27:14