制作流畅的动画
问题描述:
我有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)
答
如果你有一堆图像,你应该检查出Android Drawable Animation而不是使用可运行。
它允许您定义一组drawables和每个应显示的持续时间。
它由本平台本地支持,并将更加简单和无痛苦地实施。
答
您需要,否则预载的图片中setImageResource()
将加载(从存储读取)的图像在每个电话应该需要超过50ms(我想你的图像不只是20x20)
答
使用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();
我有一个内存错误(请参阅编辑),你可以知道如何处理这个问题? – morg 2013-02-12 10:16:17